2010-07-19 67 views
6

Tôi đã sử dụng 101 LINQ Samples để làm ướt chân bằng LINQ. Đó là một nguồn tài nguyên đầu tiên tốt, nhưng tôi không thể nhìn thấy một ví dụ về những gì tôi hiện đang cần.Số Nhóm trong Nhóm LINQ theo Truy vấn

Tôi chỉ cần liên kết số nhóm tuần tự với từng nhóm. Tôi có giải pháp làm việc:

var groups = 
    from c in list 
    group c by c.Name into details 
    select new { Name = details.Key, DetailRecords = details }; 


int groupNumber = 0; 
foreach (var group in groups) 
{ 
    // 
    // process each group and it's records ... 
    // 

    groupNumber++; 
} 

Nhưng, tôi chắc chắn có thể sử dụng LINQ để tạo nhómNumber. Làm sao?

Trả lời

9

Điều này phụ thuộc vào nhu cầu chính xác của bạn, nhưng bạn có thể sử dụng:

var groupArray = groups.ToArray(); 

Tương tự, bạn có thể sử dụng ToList. Các cấu trúc dữ liệu này là tuần tự và mỗi nhóm có một chỉ mục.


Nếu bạn cần chỉ số trên đối tượng bạn tạo ra, tùy chọn khác là sử dụng Select:

list.GroupBy(c => c.Name) 
    .Select((details, ind) => 
    new 
    { 
     Name = details.Key, 
     DetailRecords = details, 
     Index = ind 
    }); 
+0

heh, thông minh. Tôi thích nó. –

+0

+1 ... clever =) – Luiscencio

+0

Có hai câu trả lời ở đây. Tôi thích giải pháp ToList, nhưng hai thông số chọn là chính xác những gì tôi đang tìm kiếm. Cảm ơn nhiều. –

6

này nên làm như lừa:

int groupNumber = 0; 
var groups = 
    from c in list 
    group c by c.Name into details 
    select new { Name = details.Key, DetailRecords = details, grpNum = groupNumber++}; 
+0

+1 để liên kết GroupNumber với kết quả LINQ. –

1

nếu nó chỉ là một số nhóm tuần tự, chỉ cần sử dụng các phương pháp Count() trên của bạn IEnumerable.

var groups = 
    from c in list 
    group c by c.Name into details 
    select new {Name = details.Key, DetailRecords = details}; 

for(int i = 0; i < groups.Count(); i++) 
{ 
    //Process Records 
} 

Sau đó, nếu bạn cần số nhóm cụ thể, bạn có thể chỉ cần lấy i.

+0

Giống như giải pháp ban đầu của tôi, nhưng sạch hơn trong đó số tiền sẽ không bị mất trong mã xử lý. –