2010-01-24 17 views
8

Öğe adlı bir dersim var. Öğe, bir dize olan ItemCode adlı bir tanımlayıcı özelliğe sahiptir. Öğeler listesindeki tüm farklı olmayan Öğelerin listesini almak istiyorum.IEnumerable'dan farklı olmayan öğeler alın

Örnek:

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

ben alttaki iki girdileri ben
var distinctItems = itemsList.Distinct(); 

ben büyük belirgin öğelerin listesini almak kullanırsanız

içeren bir liste istiyorum, ama istiyorum bunun neredeyse tersi. Farklı listeyi orijinal listeden çıkartabilirim, ancak bu, her birinin yalnızca bir örneği olan ALL tekrarlarını içermez.

Oyun oynamıştım ve zarif bir çözümü anlayamıyorum. Herhangi bir işaretçi veya yardım çok takdir edilecektir. Teşekkürler!

Ben 3.5 zorunda LINQ

cevap

11

Benim alabilir:

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

Teşekkürler magnus (ve Thomas) ve GroupBy'yi kullanmayı düşünmemiştim – RichK

2

Sen operatör tarafından grubuyla denemek isteyebilirsiniz mevcuttur. Fikir grubun kendilerine itemcode tarafından birden fazla üyesi ile grupları alarak böyle bir şey olacaktır:

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

Bunu derlemeye alınamıyor. Bu 'grup by' ve 'into' ifadeleri hakkında inliyor – RichK

+0

Ben grup arasında "i" unuttum ve: $ Şimdi sabit, ama aslında magnus yazdığı aynı şey. –

0

Özel bir uzantısı yöntemi yazmaya önermek istiyorum, böyle bir şey: Ayrıca öğeleri doğru kendi kod tarafından karşılaştırılır anlaşılması için, öğe sınıf için Eşittir() yöntemini geçersiz gerekir

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; 
      }      
     } 
    } 
} 

. Uzatma yöntemi olarak

11

:

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

Temiz ve çok yeniden kullanılabilir, teşekkürler! – crabCRUSHERclamCOLLECTOR

İlgili konular