2008-10-21 115 views
3

我剛剛開始學習linq和lambda表達式,它們似乎很適合在複雜對象集合中查找重複項,但我得到了一些困惑並希望有人能幫助我重新走上開心編碼的道路。使用Linq或Lambda表達式檢查複雜對象中的重複內容

我對象的結構類似於list.list.uniqueCustomerIdentifier

我需要確保有在整個複雜的對象沒有重複uniqueCustomerIdentifier。如果有重複,我需要確定哪些重複,並返回重複列表。

回答

9
  • 拆開層次
  • 項目的每個元素到其UniqueID屬性
  • 集團這些ID的向上
  • 濾波器組由具有超過1個元件
  • 項目每個組到組的密鑰組(返回唯一標識)
  • 枚舉查詢並將結果存儲在列表中。

var result = 
    myList 
    .SelectMany(x => x.InnerList) 
    .Select(y => y.uniqueCustomerIdentifier) 
    .GroupBy(id => id) 
    .Where(g => g.Skip(1).Any()) 
    .Select(g => g.Key) 
    .ToList() 
+3

你可以跳過。選擇(Y => y.uniqueCustomerIdentifier),並使用.GroupBy(Y => y.uniqueCustomerIdentifier)來代替。 – Lucas 2008-11-01 05:02:55

2

有一個linq運算符Distinct(),它允許您在只需要id的情況下過濾到一組不同的記錄。如果您已設置課程覆蓋等於您或有一個IEqualityComparer,您可以直接調用Distinct擴展方法來返回列表中的唯一結果。作爲額外的獎勵,您還可以使用聯合和交集方法在兩個列表之間進行合併或過濾。

另一種選擇是按id進行分組,然後選擇第一個元素。

var results = from item in list 
       group item by item.id into g 
       select g.First(); 
0

如果要拼合兩個列表層次結構,使用SelectMany方法扁平化的IEnumerable<IEnumerable<T>>IEnumerable<T>