我尝试使用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;
}
答案 0 :(得分:1)
Distinct
使用引用相等性,除非在项类型上覆盖Equals
(和GetHashCode
)。由于Equals
未覆盖XElement
,因此无论其内容如何,每个元素都是“不同的”。
如果您想要Name
或其他属性(或属性组合)的不同元素,您可以选择以下几个选项:
将元素投影为匿名类型,默认情况下 实现值相等:
var topicColl = xDoc.Descendants("topic")
.Select(e => new {e.Name, e.Value})
.Distinct();
使用GroupBy
,允许在
IEqualityComparer<XElement>
的类,并将其传递给Distinct
DistinctBy
,它还允许在