Danh sách làm phẳng trong LINQ


314

Tôi có một truy vấn LINQ trả về IEnumerable<List<int>>nhưng tôi chỉ muốn trả về List<int>vì vậy tôi muốn hợp nhất tất cả các bản ghi của mình IEnumerable<List<int>>trong một mảng duy nhất.

Thí dụ :

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

Tôi muốn lấy tất cả kết quả của mình IEnumerable<List<int>>cho chỉ mộtList<int>

Do đó, từ mảng nguồn: [1,2,3,4] và [5,6,7]

Tôi chỉ muốn một mảng [1,2,3,4,5,6,7]

Cảm ơn

Câu trả lời:


568

Thử SelectMany()

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

8
Cảm ơn, tôi luôn quên cái này - tôi biết nó ở đó, nhưng tôi chỉ dành quá nhiều thời gian cho Google mỗi khi tôi cần sử dụng nó. Đánh dấu câu trả lời này. :-)
BrainSlugs83

Trong một thời gian, tôi sợ rằng tôi là người duy nhất từng cần điều này. Cảm ơn Mike!
Arnab Chakraborty

7
Có một số cú pháp thay thế cho SelectMany( i => i )? Tôi đã thấy cú pháp này được sử dụng rất nhiều nhưng có vẻ như việc sử dụng tính năng chọn bị suy giảm, vì vậy tôi đã mong đợi các nhà thiết kế ngôn ngữ đưa ra một cú pháp phím tắt dành riêng cho danh sách các danh sách
Andy

86

Với cú pháp truy vấn:

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

Cảm ơn cú pháp chính xác mà tôi đang tìm kiếm, và rất nhiều câu trả lời SO liệt kê một cái gì đó dài dòng hơn.
SilverSideDown

Điều này là nhiều, tốt hơn nhiều so với SelectMany. Rõ ràng hơn chính xác những gì đang diễn ra trên IMO, cảm ơn vì đã chỉ ra điều này!
Bryan Rayner

3
Cá nhân tôi luôn thấy phiên bản cú pháp truy vấn ít trực quan hơn nhiều so với phiên bản gọi phương thức. Khi Resharper đề nghị chuyển đổi các vòng lặp thành các biểu thức LINQ nếu nó cung cấp cho tôi cú pháp truy vấn mà tôi luôn luôn hoàn tác.
bikeman868

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

6
@recursive Những gì người khác đã bỏ lỡ? .ToArray()? - Đó là một tình huống - nếu bạn chỉ cần lặp lại một lần - hoặc nếu các mục có khả năng thay đổi, thì đó .ToArray()chắc chắn không phải là điều bạn muốn. Nhưng với các mục tĩnh mà bạn sẽ liệt kê nhiều lần .ToList()hoặc .ToArray()sẽ cải thiện hiệu suất (với chi phí sử dụng bộ nhớ cao hơn một chút, thường là một thỏa thuận khá tốt).
BrainSlugs83

2
Có lẽ các trường hợp trong trường hợp này yêu cầu mảng, vì điều đó đã được chỉ định trong câu hỏi.
đệ quy

8
@recursive, nếu chúng tôi đang nitpicking, OP nói rằng anh ta cần phải quay lại List<int>, vì vậy đó .ToList()sẽ là lựa chọn chính xác.
MEMark

@MEMark OP cũng tuyên bố "chỉ một mảng"
StefanJanssen

12

Như thế này?

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

11

Nếu bạn có một List<List<int>> kbạn có thể làm

List<int> flatList= k.SelectMany( v => v).ToList();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.