Згладити список у LINQ


313

У мене є запит 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]

Дякую

Відповіді:


567

Спробуйте SelectMany()

var result = iList.SelectMany( i => i );

8
Дякую, я завжди забуваю це - я знаю, що він є, але я просто витрачаю занадто багато часу на Гуглінг для нього кожен раз, коли мені потрібно його використовувати. Закладка цієї відповіді. :-)
BrainSlugs83

Якийсь час я боявся, що я єдиний, хто коли-небудь потребував цього. Дякую Майку!
Арнаб Чакраборті

7
Чи є альтернативний синтаксис для SelectMany( i => i )? Я бачив, як цей синтаксис використовується багато, але, здається, виснажене використання функції select, тому я б очікував, що дизайнери мови придумують синтаксис ярликів спеціально для списків списків
Енді

86

З синтаксисом запиту:

var values =
from inner in outer
from value in inner
select value;

Дякую точному синтаксису, який я шукав, і так багато відповідей ТА перераховують ще щось багатослівне.
SilverSideDown

Це набагато, набагато краще, ніж SelectMany. Більш зрозуміло, що саме відбувається IMO, дякую, що вказали на це!
Брайан Рейнер

3
Особисто я завжди вважаю версію синтаксису запиту набагато менш інтуїтивно зрозумілою, ніж версія виклику методу. Коли Resharper пропонує конвертувати петлі в вирази LINQ, якщо це дає мені синтаксис запитів, я завжди іду на скасування.
bikeman868

23
iList.SelectMany(x => x).ToArray()

6
@recursive Що ще пропустили всі? .ToArray()? - Це така обставинна ситуація - якщо вам потрібно лише повторити повтор - або якщо елементи, ймовірно, зміниться, то .ToArray()це точно не те, що ви хочете. Але зі статичними елементами, які ви збираєтеся перераховувати декілька разів, .ToList()або .ToArray()покращить продуктивність (ціною трохи більшого використання пам’яті, що, як правило, є досить хорошою справою).
BrainSlugs83

2
Імовірно, обставини в даному випадку потребують масивів, оскільки це було зазначено в питанні.
рекурсивна

8
@recursive, якщо ми запускаємо нитки, ОП каже, що йому потрібно повернутися List<int>, тож .ToList()був би правильний вибір.
ПАМ’ЯТЬ

@MEMark OP також заявляє "лише для одного масиву"
StefanJanssen

12

Подобається це?

var iList = Method().SelectMany(n => n);

11

Якщо у вас є, List<List<int>> kви можете зробити

List<int> flatList= k.SelectMany( v => v).ToList();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.