2011-12-15 48 views
132

Tôi có câu hỏi về phương pháp IGrouping và Select().Cách nhận các giá trị từ IGrouping

phép nói rằng tôi đã có IEnumerable<IGrouping<int, smth>> theo cách này:

var groups = list.GroupBy(x => x.ID); 

nơi danh sách là một List<smth>.

Và bây giờ tôi cần phải vượt qua giá trị của mỗi IGrouping vào danh sách khác một cách nào đó .:

foreach (var v in structure) 
{ 
    v.ListOfSmth = groups.Select(...); // <- ??? 
} 

Ai có thể đề nghị làm thế nào để có được giá trị (List<smth>) từ IGrouping<int, smth> trong bối cảnh như vậy?

+0

ID thường là một lĩnh vực nhận dạng mà phải là duy nhất, mà sẽ làm cho nhóm bởi nó vô dụng, nếu bạn chỉ cố gắng để loại bỏ dữ liệu trùng lặp thử biệt() để thay thế. nếu nó đã được list.GroupBy (x => x.SubID) sau đó nó sẽ có ý nghĩa để sử dụng nhóm nhưng trong trường hợp đó bạn rất có thể sẽ muốn giữ cho nhóm và foreach (var grp trong nhóm) {grp.ToList() ; } sẽ làm điều đó – MikeT

Trả lời

193

Kể từ IGrouping<TKey, TElement> thực hiện IEnumerable<TElement>, bạn có thể sử dụng SelectMany để đặt tất cả các IEnumerables lại thành một IEnumerable tất cả cùng nhau:

List<smth> list = new List<smth>(); 
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.id); 
IEnumerable<smth> smths = groups.SelectMany(group => group); 
List<smth> newList = smths.ToList(); 
+2

Đó không phải là giống như một "orderBy" bình thường? Danh sách newList = list .OrderBy (x => x.id) .ToList(); – MorgoZ

+0

@MorgoZ, câu hỏi là về việc lấy các nhóm '' và trở lại danh sách phẳng. –

+1

@MorgoZ, 'OrderBy (x => x.id)' sẽ sắp xếp chúng theo thứ tự tăng dần theo ID. Ngược lại với '.GroupBy (x => x.id) .SelectMany (group => group)', sẽ sắp xếp chúng theo thứ tự xuất hiện đầu tiên của ID. Nếu ID ban đầu theo thứ tự: [1,3,2,2,2,3,0], sau đó nhóm chúng lại và sau đó san phẳng thành một danh sách sẽ đặt ID theo thứ tự mới: [1,3, 3,2,2,2,0]. –

24
foreach (var v in structure) 
{  
    var group = groups.Single(g => g.Key == v. ???); 
    v.ListOfSmth = group.ToList(); 
} 

Trước tiên, bạn cần phải chọn nhóm bạn muốn. Sau đó, bạn có thể sử dụng phương pháp ToList trên nhóm. Các IGrouping là một IEnumerable của các giá trị.

7

Từ định nghĩa của IGrouping:

IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable 

bạn chỉ có thể lặp qua các yếu tố như thế này:

IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID) 
foreach(IEnumerable<smth> element in groups) 
{ 
//do something 
} 
+0

lặp lại thông qua ông nhóm không phải là các mục trong nhóm – MikeT

+0

Oh sai lầm của tôi, sau đó: 'foreach (smth p trong groups.SelectMany (sth => sth)) ' – user1275513

8

phiên bản More làm rõ các câu trả lời ở trên:

IEnumerable<IGrouping<int, ClassA>> groups = list.GroupBy(x => x.PropertyIntOfClassA); 

foreach (var groupingByClassA in groups) 
{ 
    int propertyIntOfClassA = groupingByClassA.Key; 

    //iterating through values 
    foreach (var classA in groupingByClassA) 
    { 
     int key = classA.PropertyIntOfClassA; 
    } 
} 
Các vấn đề liên quan