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
,这也允许传入等式表达式
我尝试使用 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
,这也允许传入等式表达式