Разбиение списков целых чисел на основе содержащихся в них уникальных наборов чисел

#c# #linq #merge #duplicates #set-theory

#c# #linq #слияние #дубликаты #теория множеств

Вопрос:

У меня есть список целых чисел, подобный —

 List<List<int>> dataList = new List<List<int>> {
                new List<int>{ 0, 2, 4, 7 },
                new List<int>{ 1, 6, 3 },
                new List<int>{ 2, 0, 7, 9 },
                new List<int>{ 3, 1, 6 },
                new List<int>{ 4, 0, 2 },
                new List<int>{ 5, 2, 7 },
            };
  

Я хочу объединить весь список, в котором есть дубликаты, и сгенерировать список целых чисел, в котором значения не должны быть общими ни в одном списке.

Вывод должен быть следующим—

0, 2, 4, 5, 7, 9

1, 3, 6

Комментарии:

1. Что произойдет, если (дополнительным) вводом будет: { 1, 2 } ? Есть ли тогда один вывод или ..?

2. @user2864740 тогда на выходе будет только один список с 0,1,2,3,4,5,6,7,9

3. @user2864740 Да, тогда это будет только один вывод, который должен быть похож на List<Список<int> output={ {0,1,2,3,4,5,6,7,9} };

4. Наивно, я бы начал с того, что каждое число является собственным «набором», например. {1=> {1}, 2=>{2}} . Когда число, если оно найдено в той же последовательности, что и другое число, оно также добавляется к этому набору и сворачивается в тот же экземпляр (т. Е. возьмите экземпляр объекта set с меньшим числом): {1=> {1,2}, 2=> /* same instance as 1 */} , например .. после того, как все последовательности будут обработаны таким образом, будет, {1=>..,n=>..} где значения будут разными наборами. Я уверен, что есть более потрясающий подход.

5. @user2864740 Я могу решить это по-вашему, но для этого нужно выполнить цикл по каждому элементу каждого списка. Я ожидал, как я могу это сделать с помощью Linq.

Ответ №1:

Если вам нужен один список, то вы можете сделать это:

 // flatten your list:
var newList = new List<int>();
foreach (var list in output) {
  newList.AddRange(list);
}
// make sure every number is only once in that list:
newList.Distinct() // here is linq!
var output = new List<List<int>>();
output.Add(newList);