#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);