Distinct() 方法不起作用?

Distinct() method does not work?

我尝试使用 Distinct() 来过滤我的集合以防止重复,但我的 linq 查询仍然将相同的值添加到列表中。

提前致谢。

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

Distinct 默认使用引用相等,除非 Equals(和 GetHashCode)在项类型上被覆盖。由于 Equals 未被 XElement 覆盖,因此无论其内容如何,​​每个元素都是 "distinct"。

如果您想要通过 Name 或其他一些 属性(或属性组合)来区分元素,您有几个选择:

  • 将元素投影到匿名类型,默认情况下实现值相等:

    var topicColl = xDoc.Descendants("topic")
                        .Select(e => new {e.Name, e.Value})
                        .Distinct();
    
  • 使用GroupBy,允许传入一个表达式

  • 创建一个 class 以您想要的方式实现 IEqualityComparer<XElement> 并将其传递给 Distinct
  • 使用 MoreLinq 中的 DistinctBy,这也允许传入等式表达式