Свести список в LINQ

314

У меня есть запрос LINQ, который возвращает, IEnumerable<List<int>>но я хочу вернуть только List<int>так, я хочу объединить все мои записи в моем IEnumerable<List<int>>только один массив.

Пример :

IEnumerable<List<int>> iList = from number in
    (from no in Method() select no) select number;

Я хочу взять все мои результаты IEnumerable<List<int>>только к одномуList<int>

Следовательно, из исходных массивов: [1,2,3,4] и [5,6,7]

Я хочу только один массив [1,2,3,4,5,6,7]

Спасибо

Седрик Бойвин
источник

Ответы:

568

Пытаться SelectMany()

var result = iList.SelectMany( i => i );
Майк Два
источник
8
Спасибо, я всегда об этом забываю - я знаю, что он есть, но я просто трачу слишком много времени, гугляя его каждый раз, когда мне нужно его использовать. Закладка этого ответа. :-)
BrainSlugs83
Некоторое время я боялся, что я единственный, кто когда-либо нуждался в этом. Спасибо, Майк!
Арнаб Чакраборти
7
Есть ли альтернативный синтаксис для SelectMany( i => i )? Я видел, что этот синтаксис часто используется, но, похоже, вырожденное использование функции выбора, поэтому я ожидал, что разработчики языка
Энди
86

С синтаксисом запроса:

var values =
from inner in outer
from value in inner
select value;
рекурсивный
источник
Благодаря точному синтаксису, который я искал, и так много ответов SO перечисляют что-то более подробное.
SilverSideDown
Это намного лучше, чем SelectMany. Более ясно, что именно происходит в IMO, спасибо за указание на это!
Брайан Рейнер
3
Лично я всегда нахожу синтаксис запроса версии гораздо менее интуитивным, чем метод, вызывающий версию. Когда Resharper предлагает преобразовать циклы в выражения LINQ, если он дает мне синтаксис запроса, я всегда иду отменить.
bikeman868 23.09.16
23
iList.SelectMany(x => x).ToArray()
Дилан Битти
источник
6
@recursive Что пропустили все остальные? .ToArray()? - Это довольно косвенно - если вам нужно выполнить итерацию один раз - или если элементы могут измениться, то .ToArray()это определенно не то, что вы хотите. Но со статическими элементами, которые вы собираетесь перечислять несколько раз, .ToList()или .ToArray()это даст улучшение производительности (за счет немного более высокого использования памяти, что, как правило, довольно неплохо).
BrainSlugs83
2
Предположительно обстоятельства в этом случае требуют массивов, так как это было указано в вопросе.
рекурсивный
8
@ recursive, если мы придираемся, ОП говорит, что ему нужно вернуться List<int>, так .ToList()что тогда будет правильный выбор.
MEMark
@MEMark OP также сообщает «только одному массиву»
StefanJanssen
12

Как это?

var iList = Method().SelectMany(n => n);
MQP
источник
11

Если у вас есть, List<List<int>> kвы можете сделать

List<int> flatList= k.SelectMany( v => v).ToList();
Даниил
источник