Преобразовать список <List <T>> в список <T>в C # - PullRequest
17 голосов
/ 20 января 2009

У меня есть List<List<int>>. Я хотел бы преобразовать его в List<int>, где каждый int уникален. Мне было интересно, есть ли у кого-нибудь элегантное решение с помощью LINQ.

Я бы хотел использовать метод Union, но он каждый раз создает новый List <>. Поэтому я бы хотел избежать таких действий:

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

foreach(List<int> list in listOfLists)
   allInts = new List<int>(allInts.Union(list));

Есть предложения?

Спасибо!

Ответы [ 3 ]

44 голосов
/ 20 января 2009
List<List<int>> l = new List<List<int>>();

l.Add(new List<int> { 1, 2, 3, 4, 5, 6});
l.Add(new List<int> { 4, 5, 6, 7, 8, 9 });
l.Add(new List<int> { 8, 9, 10, 11, 12, 13 });

var result = (from e in l
              from e2 in e
              select e2).Distinct();

Обновление 09.2013

Но в эти дни я бы написал это как

var result2 = l.SelectMany(i => i).Distinct();
15 голосов
/ 20 января 2009
List<int> result = listOfLists
  .SelectMany(list => list)
  .Distinct()
  .ToList();
10 голосов
/ 20 января 2009

Как насчет:

HashSet<int> set = new HashSet<int>();
foreach (List<int> list in listOfLists)
{
    set.UnionWith(list);
}
return set.ToList();
...