我尝试使用Distinct()来过滤我的集合以防止重复,但我的linq查询仍然将相同的值添加到列表中。
thanks in advance.
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
覆盖,所以无论其内容如何,每个元素都是"不同的"。
如果你想通过Name
或其他属性(或属性的组合)来区分元素,你有几个选项:
-
将元素投影到一个匿名类型,在默认情况下实现值相等:
var topicColl = xDoc.Descendants("topic") .Select(e => new {e.Name, e.Value}) .Distinct();
-
使用
GroupBy
,允许在 中传递表达式。 - 创建一个实现
IEqualityComparer<XElement>
的类,并将其传递给Distinct
- 使用
DistinctBy
from MoreLinq,它也允许在 中传递相等表达式