Свести список в 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


11

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

List<int> flatList= k.SelectMany( v => v).ToList();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.