Nano Hash - криптовалюты, майнинг, программирование

Добавить отдельные элементы из списка в другой список

Я хотел бы выполнить то, о чем говорится в заголовке, но не знаю, как это сделать.

У меня есть 2 списка:

public List<int[,]> LongList = new List<int[,]>();
public List<int[,]> UniqueList = new List<int[,]>();

Для дальнейшего объяснения, вот сценарий:

Загадки:

public int[,] puzzle1 = new int [3,3] { {1,2,3},
                                            {8,4,0},
                                            {7,6,5} }; //[1,2,3;8,4,0;7,6,5]

    public int[,] puzzle2 = new int [3,3] { {8,7,6},
                                            {1,0,5},
                                            {2,3,4}  }; //[8,7,6;1,0,5;2,3,4]


    public int[,] puzzle3 = new int [3,3] { {7,6,3},
                                            {1,0,2},  
                                            {8,4,5}  }; //[7,6,3;1,0,2;8,4,5]

LongList содержит:

LongList.Add(puzzle1); 
LongList.Add(puzzle1); 
LongList.Add(puzzle1); 
LongList.Add(puzzle1);
LongList.Add(puzzle2);
LongList.Add(puzzle2);
LongList.Add(puzzle3);
LongList.Add(puzzle3);
LongList.Add(puzzle3);

Я хотел бы, чтобы уникальный список содержал УНИКАЛЬНЫЕ значения из LongList. КАК ЕСЛИ это случилось:

UniqueList.Add(puzzle1);
UniqueList.Add(puzzle2);
UniqueList.Add(puzzle3);

В виде уравнения: UniqueList = Отдельные значения из LongList

Список полон многократных повторяющихся значений, и я хотел бы взять только уникальные и поместить их в UniqueList.

Я пытаюсь решить головоломку, и LongList будет содержать несколько ссылок на одну и ту же головоломку и многое другое. Чтобы упростить обсуждение:

LongList значений: 1,1,1,1,2,2,3,4,4,4,4,5,5

Я бы хотел, чтобы UniqueList содержал головоломки: 1,2,3,4,5


  • возможный дубликат: stackoverflow.com/questions/4639036 / 04.04.2013
  • вы также можете проверить ответы на этот вопрос: stackoverflow.com/questions/1388361/ 04.04.2013
  • @IsmetAlkan, это почти не дубликат 04.04.2013
  • У вас будут одни и те же объекты несколько раз или разные объекты с одинаковым содержанием? 04.04.2013
  • Проблема в том, что нет подходящего встроенного компаратора или даже хорошей операции равенства для многомерных массивов. Использование некоторых примеров на stackoverflow.com/ questions / 4423318 / how-to-compare-array-in-c, возможно, может помочь. 04.04.2013
  • @caerolus Я тоже не думаю, что это точный дубликат, я сказал, что это возможно, как вы видите, но я думаю, что он почти полностью дублирован. 04.04.2013
  • Я не думаю, что ему здесь нужно сравнение массивов в соответствии со значениями списка, которые он дал сейчас. 04.04.2013
  • Вы действительно используете многомерные массивы? Это не имеет большого смысла, если вы 04.04.2013
  • Разве тогда uniqueList не должен быть List<int>? 04.04.2013
  • Да, я использую многомерные массивы (я уверен на 100%), они содержат состояния для головоломки, которую я пытаюсь решить. Что вы предлагаете не имеет смысла? 04.04.2013
  • Или, если вы хотите сгладить каждый int[,] по отдельности, возможно, List<int[]>? 04.04.2013
  • Допустим, у вас есть список из двух элементов: {[[0, 1], [2, 3]], [[2, 2], [4, 5]]}. Вы превращаете это в {0, 1, 2, 3, 4, 5} или {[0, 1, 2, 3], [2, 4, 5]}? 04.04.2013
  • Я тоже не верю (простите, если ошибаюсь). Пожалуйста, проверьте отредактированный вопрос. 04.04.2013
  • Что произойдет, если появится еще одна головоломка (головоломка 4) с точно такими же значениями, как и головоломка 3? Должен ли он быть включен? 04.04.2013
  • Привет, Мэтт, спасибо за терпение (тоже caerolus). Такого сценария не должно возникнуть, поэтому я не верю, что это будет проблемой. 04.04.2013

Ответы:


1

Комментарии OP расплывчаты.

Вариант 1. Уникальные числа из всех многомерных массивов

List<int> UniqueList = new List<int>();

UniqueList = LongList.Select(i => Flatten(i))
               .SelectMany(i => i)
               .Distinct()
               .ToList();

Это превратит {[[0, 1], [2, 3]], [[2, 2], [4, 5]]} в {0, 1, 2, 3, 4, 5}

См. Ниже для Flatten

Вариант 2. Уникальные многомерные массивы по значениям

NB: Предполагается, что размер и количество измерений каждого многомерного массива совпадают.

List<int[,]> UniqueList = new List<int[,]>();
foreach (var e in LongList)
{
  IEnumerable<int> flat = Flatten(e);
  if (!UniqueList.Any(i => Flatten(i).SequenceEqual(flat)))
  {
    UniqueList.Add(e);
  }
}

Это превратит {[[0, 1], [2, 3]], [[0, 1], [2, 3]], [[2, 2], [4, 5]]} в {[[ 0, 1], [2, 3]], [[2, 2], [4, 5]]}

См. Ниже для Flatten

Вариант 3. Только уникальные ссылки

UniqueList = aList.Distinct().ToList();

NB: Это был оригинальный ответ для контекста комментариев.

Метод сглаживания

Во всех случаях Flatten взято из ответа SO Guffa

public static IEnumerable<T> Flatten<T>(T[,] items) {
  for (int i = 0; i < items.GetLength(0); i++)
    for (int j = 0; j < items.GetLength(1); j++)
      yield return items[i, j];
}

Другие варианты

Если OP хочет чего-то еще (например, сглаживания List<int[,]> до List<int[]> или поддержки многомерных массивов разного размера), им придется оставить комментарий.

04.04.2013
  • Зависит от вашего определения слова «уникальный». Я провел тест в LINQPad, и он соответствовал моей интуиции. Я возьму код и отправлю обратно. 04.04.2013
  • Я только что проверил, но нет. 04.04.2013
  • Под уникальным я имею в виду: список будет содержать значения: 1,1,1,2,2,2,3,3,4,4,4,4,5 (упрощенный для объяснения, поскольку они на самом деле многомерные результаты ). И я только хочу, чтобы UniqueList содержал: 1,2,3,4,5 04.04.2013
  • Да, он выполняет ссылочное равенство, а не равенство одного и того же значения. Хорошо, удаляю мой ответ, поскольку он не соответствует тому, что хочет OP. 04.04.2013
  • Я не думаю, что ваше объяснение упрощает. Это на самом деле все усложняет. Можете ли вы привести многомерный пример того, что вам нужно? Похоже, только уникальные числа во всех многомерных массивах? Или набор многомерных массивов, которые содержат только уникальные числа в каждом соответствующем исходном массиве? 04.04.2013
  • Извините, пожалуйста, посмотрите мой отредактированный вопрос. Если вам нужна дополнительная информация, дайте мне знать! 04.04.2013

  • 2

    Основываясь на обновлении OP, нам просто нужно удалить повторяющиеся ссылки. Таким образом, нам не нужно сравнивать по стоимости. Distinct следует делать:

    UniqueList = LongList.Distinct().ToList();
    
    04.04.2013
  • ха-ха, мой первый ответ ... Я все равно поддерживаю вас за то, что вы были так терпеливы с этим, как и я :-) 04.04.2013
  • Я просто подумал об этом ... обновите ваш и позвольте этому быть ответом :-) Кстати ... Я не уверен, действительно ли это просто ссылки, или он просто сделал этот пример, чтобы было проще ... 04.04.2013
  • Судя по его комментарию, в нем содержится несколько ссылок на одну и ту же головоломку, как вы понимаете, правильно для меня. 04.04.2013
  • не уверен, правда. +1 тебе тоже и пусть сам решает, что он имеет в виду :-) 04.04.2013
  • Большое спасибо, ребята! Если бы я вызвал уникальный список следующим образом: UniqueList [0] UniqueList [1] UniqueList [2], мне бы он понадобился, чтобы получить Puzzle1, Puzzle2 и Puzzle 3 (без дубликатов, которые содержит LongList) .. Имеет ли этот код предоставить это? 04.04.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..