2012-02-03 33 views
13

Tôi có danh sách sau đâynhóm LINQ bởi, trật tự bởi

ID Counter SrvID FirstName 
-- ------ ----- --------- 
1 34  66M James 
5 34  66M Keith 
3 55  45Q Jason 
2 45  75W Mike 
4 33  77U Will 

Những gì tôi muốn làm là để tự do ID bằng cách tăng dần và sau đó nhận được giá trị đầu tiên của Counter, SrvID trùng (nếu có).

Vì vậy, đầu ra sẽ là một cái gì đó như:

ID Counter SrvID FirstName 
-- ------ ----- --------- 
1 34  66M James 
2 45  75W Mike 
3 55  45Q Jason 
4 33  77U Will 

Lưu ý cách ID của 5 được lấy ra khỏi danh sách như Counter và SrvID là giống hệt với những gì tôi đã cho ID 1 nhưng như ID 1 đến đầu tiên tôi loại bỏ 5.

Đây là những gì tôi sẽ làm nhưng không làm việc

var result = (from ls in list1 
        group ts by new {ls.Counter, ls.SrvID} 
       order by ls.ID 
        select new{ 
          ls.ID, 
          ls.Counter.FirstOrDefault(), 
          ls.SrvID.First, 
          ls.FirstName}).ToList() 
+0

@ChrisWue - Cảm ơn bạn tinh chỉnh các định dạng. Làm thế nào bạn định dạng nó thành một bảng? –

+0

Đó chỉ là định dạng mã tiêu chuẩn: thụt lề bằng 4 dấu cách – ChrisWue

Trả lời

27
list1.GroupBy(item => new { Counter = item.Counter, SrvID = item.SrvID }) 
    .Select(group => new { 
     ID = group.First().ID, 
     Counter = group.Key.Counter, 
     SrvID = group.Key.SrvID, 
     FirstName = group.First().FirstName}) 
    .OrderBy(item => item.ID); 
+0

Cảm ơn bạn đã phản hồi. Tại sao bạn có một First() bên cạnh FirstName và ID? –

+1

GroupBy sẽ trả về cho bạn một Counter/SrvID để tra cứu mục, mỗi thành viên tra cứu có một khóa (Counter/SrvID) và các mục liên quan. Vì vậy, đối với mỗi nhóm tra cứu, bạn có thể trích xuất Counter/SrvID từ khóa và ID và FirstName từ kết quả khớp đầu tiên trong mỗi nhóm. –

+0

@ vc74 cảm ơn bạn đã trả lời. bạn sẽ có thể xây dựng những gì đang xảy ra trong biểu thức LINQ? – BKSpurgeon

18

Nhóm các bản ghi lên và chọn người chiến thắng từ mỗi nhóm.

var query = 
    from record in list1 
    group record by new {record.Counter, record.SrvID } into g 
    let winner = 
    (
    from groupedItem in g 
    order by groupedItem.ID 
    select groupedItem 
).First() 
    select winner; 

var otherQuery = list1 
    .GroupBy(record => new {record.Counter, record.SrvID }) 
    .Select(g => g.OrderBy(record => record.ID).First()); 
+0

Cảm ơn bạn đã phản hồi - Bạn có thể làm rõ thêm cách var query = từ bản ghi trong list1 hoạt động .. Cảm ơn lần nữa –

+0

Dòng đầu tiên của câu trả lời này có lẽ là cách tốt nhất mà tôi đã thấy để mô tả cách sử dụng GroupBy bằng tiếng Anh thực. – Clint

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