2015-05-14 161 views
1

我試圖使用Distinct()過濾我的集合以防止重複,但我的linq查詢仍然將相同的值添加到列表中。Distinct()方法不起作用?

在此先感謝。

public ObservableCollection<string> CollectTopicsFromXml() 
    { 
     ObservableCollection<string> oc = new ObservableCollection<string>(); 
     XDocument xDoc = XDocument.Load(path); 
     var topicColl = xDoc.Descendants("topic").Distinct(); 


     foreach (var topic in topicColl) 
     { 
      oc.Add(topic.Value); 
     } 

     return oc; 
    } 

回答

1

Distinct默認使用參考平等除非Equals(和GetHashCode)的項目類型覆蓋。由於Equals未被重寫爲XElement,因此每個元素都是「獨立的」,無論其內容如何。

如果你想通過Name或一些其他財產(物業或組合)不同的元素,你有幾種選擇:

  • 項目中的元素,以一個匿名類型的落實默認值相等:

    var topicColl = xDoc.Descendants("topic") 
            .Select(e => new {e.Name, e.Value}) 
            .Distinct(); 
    
  • 使用GroupBy,其允許表達在

  • 012被傳遞
  • 創建,在你所希望的方式實現IEqualityComparer<XElement>一類,並傳遞到Distinct
  • 使用DistinctByMoreLinq這也讓一個等價式在
傳遞