2009-10-19 37 views
215

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

Ví dụ:

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

Tôi muốn đưa tất cả các kết quả của tôi IEnumerable<List<int>> để chỉ có một List<int>

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

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

Cảm ơn

Trả lời

386

Hãy thử SelectMany()

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

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

+0

Trong một thời gian, tôi sợ rằng tôi là người duy nhất cần thiết. Cảm ơn Mike! –

+1

Có một số cú pháp thay thế cho 'SelectMany (i => i)' không? Tôi đã nhìn 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 lọc bị thoái hóa, vì vậy tôi đã mong đợi các nhà thiết kế ngôn ngữ đưa ra cú pháp phím tắt cụ thể cho danh sách các danh sách – Andy

7

Giống như này?

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

Có cảm ơn câu trả lời của bạn cho –

6

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

List<int> flatList= k.SelectMany(v => v).ToList(); 
19
iList.SelectMany(x => x).ToArray() 
+6

@recursive Mọi người khác đã bỏ lỡ điều gì? '.ToArray()'? - Đó là loại hoàn cảnh - nếu bạn chỉ cần lặp lại một lần - hoặc nếu các mục có thể thay đổi, thì '.ToArray()' chắc chắn không phải là thứ 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ẽ cho 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 giao dịch 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ì đã được chỉ định trong câu hỏi. – recursive

+7

@recursive, nếu chúng ta đang nitpicking, OP nói rằng anh ta cần trả về 'List ', vì vậy '.ToList()' sau đó sẽ là sự lựa chọn đúng đắn. – MEMark

70

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

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

+1 cho cú pháp thay thế –

+0

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 của SO liệt kê một số thứ khác dài dòng hơn. – SilverSideDown

+0

Điều này 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! –

Các vấn đề liên quan