2015-05-14 5 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 по умолчанию использует равенство ссылок, если EqualsGetHashCode) не переопределен от типа элемента. Поскольку Equals не переопределяется для XElement, каждый элемент «отличен» независимо от его содержимого.

Если вы хотите различных элементов от Name или какой-либо другой собственности (или сочетания свойств) у вас есть несколько вариантов:

  • проект элементы анонимного типа, который делает реализовать равенство значений по умолчанию :

    var topicColl = xDoc.Descendants("topic") 
            .Select(e => new {e.Name, e.Value}) 
            .Distinct(); 
    
  • Использование GroupBy, что позволяет выражение, которое передается в

  • Создать класс, который реализует IEqualityComparer<XElement> в том, что вы хотите, и передать, что Distinct
  • Использование DistinctBy из MoreLinq, который также позволяет выражение равенства быть переданы в
Смежные вопросы