2010-01-24 29 views
8

Tôi có một lớp được gọi là Mục. Mục có thuộc tính định danh được gọi là ItemCode, đây là một chuỗi. Tôi muốn nhận danh sách tất cả các mục không phân biệt trong danh sách các mục.Lấy các phần tử không khác biệt từ một số điện thoại có thể duyệt được

Ví dụ:

List<Item> itemList = new List<Item>() 
{ 
    new Item("code1", "description1"), 
    new Item("code2", "description2"), 
    new Item("code2", "description3"), 
}; 

Tôi muốn có một danh sách có chứa hai mục dưới

Nếu tôi sử dụng

var distinctItems = itemsList.Distinct(); 

tôi nhận được danh sách các mục riêng biệt đó là rất tốt, nhưng tôi muốn gần như ngược lại. Tôi có thể trừ danh sách riêng biệt khỏi danh sách ban đầu nhưng điều đó sẽ không chứa TẤT CẢ lặp lại, chỉ một ví dụ của mỗi danh sách.

Tôi đã chơi và không thể tìm ra giải pháp thanh lịch. Bất kỳ gợi ý hay trợ giúp nào cũng sẽ được đánh giá cao. Cảm ơn!

Tôi có 3.5 để LINQ có sẵn

Trả lời

11

mất của tôi:

var distinctItems = 
    from list in itemsList 
    group list by list.ItemCode into grouped 
    where grouped.Count() > 1 
    select grouped; 
+0

Cảm ơn magnus (và Thomas) và tôi sẽ không nghĩ đến việc sử dụng GroupBy – RichK

2

Bạn có thể muốn thử bằng nhóm theo toán tử. Ý tưởng này sẽ được nhóm chúng bởi ItemCode và tham gia các nhóm có nhiều hơn một thành viên, một cái gì đó như:

var grouped = from i in itemList 
       group i by i.ItemCode into g 
       select new { Code = g.Key, Items = g }; 

var result = from g in grouped 
      where g.Items.Count() > 1; 
+0

tôi không thể có được điều này để biên dịch. Nó rên rỉ về 'nhóm bởi' và các 'thành' báo cáo – RichK

+0

Tôi đã quên "i" giữa nhóm và bởi: $ Bây giờ nó cố định, nhưng nó cơ bản giống như magnus đã viết. –

0

tôi khuyên bạn nên viết một phương pháp mở rộng thông thường, một cái gì đó như thế này:

static class RepeatedExtension 
{ 
    public static IEnumerable<T> Repeated<T>(this IEnumerable<T> source) 
    { 
     var distinct = new Dictionary<T, int>(); 
     foreach (var item in source) 
     { 
      if (!distinct.ContainsKey(item)) 
       distinct.Add(item, 1); 
      else 
      { 
       if (distinct[item]++ == 1) // only yield items on first repeated occurence 
        yield return item; 
      }      
     } 
    } 
} 

Bạn cũng cần ghi đè phương thức Equals() cho Hạng mục của bạn để các mục được so sánh chính xác với mã của chúng.

11

như một phương pháp khuyến nông:

public static IEnumerable<T> NonDistinct<T, TKey> (this IEnumerable<T> source, Func<T, TKey> keySelector) 
{ 
    return source.GroupBy(keySelector).Where(g => g.Count() > 1).SelectMany(r => r); 
} 
+0

Sạch sẽ và rất tái sử dụng, cảm ơn! – crabCRUSHERclamCOLLECTOR

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