C# HashSet或Distinct可读取列表中属性的不同值<&燃气轮机;物体的形状

C# HashSet或Distinct可读取列表中属性的不同值<&燃气轮机;物体的形状,c#,performance,linq,c#-4.0,hashset,C#,Performance,Linq,C# 4.0,Hashset,这在某种程度上与这个()问题有关 上面的问题是关于一个简单的值数组。我有一个从第三方web服务返回的对象: public class X { public Enum y {get; set;} } 我有这些对象的列表列表数据,总共约100条记录,但不稳定。现在,我想要属性y列表中所有可能的值,并且我想要绑定这个属性,执行一个CheckBoxList.DataSource(以防出现差异) 最有效的方法是什么 我可以想到两种算法: var data = HashSet<Enum&g

这在某种程度上与这个()问题有关

上面的问题是关于一个简单的值数组。我有一个从第三方web服务返回的对象:

public class X
{
    public Enum y {get; set;}

}
我有这些对象的列表
列表数据,总共约100条记录,但不稳定。现在,我想要属性
y
列表中所有可能的值,并且我想要绑定这个属性,执行一个
CheckBoxList.DataSource
(以防出现差异)

最有效的方法是什么

我可以想到两种算法:

var data = HashSet<Enum> hashSet = new HashSet<Enum>(xs.Select(s => s.y));
chkBoxList.DataSource = data;
我的直觉是哈希集,但我不是100%确定


如果有人有任何想法,欢迎提出更好的想法?

如果是一次性操作,请使用。
Distinct
。如果要一次又一次地添加元素,请使用
HashSet

HashSet
之一,因为它在构建HashSet对象后会保留对象,并且每次都不需要昂贵的操作


另一方面,
Distinct
枚举器可能会在每次枚举数据源时进行求值,并且删除重复值的所有工作都会重复。

您能详细说明一下吗?
HashSet
是一个“重”对象,但同时添加单个项并检查唯一性非常便宜(hashset的结构执行此操作)。它还存储所有数据。
Select
的IEnumerable结果只是一个查询,每次访问对象时都会执行。因此,对于一次性使用-使用查询,对于连续使用-创建一个
HashSet
。重对象??我不明白这一点?你是说内存分配在哪里?它们都是引用ence类型,所以我不认为这是一个问题?创建一个哈希集比创建一个简单的列表更昂贵。您可以将两者结合起来-
var data=HashSet HashSet=new HashSet(xs.Select(s=>s.y).Distinct()
通过这种方式,如果您想向
数据添加更多项,则无需重新查询…保留对象?您能解释一下吗?
新建哈希集(xs.Select(s=>s.y))
-这将创建一个哈希集包含(keep)
s.y
的所有不同值;每次有人枚举它时,他只需检查集合的内容
xs.Select(s=>s.y).distinct()
-这将创建一个迭代器对象,该对象知道如何生成
s.y
的不同值,但不存储它们-每次您枚举它时,它将再次运行整个算法。这个答案是误导性的,因为您可以简单地调用
distinct()。ToList()
以避免重复求值。事实上,在使用
IEnumerable
s时,这是一种非常常见的模式。此外,
Distinct().ToList()
过滤现有集合的速度稍微快一点,而且可以说其意图更具表现力。请参见本答案末尾的基准@Livven,将唯一项保留在列表中更具表现力?我强烈反对。哈希集本质上是关于唯一性的,比ToList()更灵活、更明确-正在处理Linq查询。@staafl同意不同意,但这不是我评论的重点。无论您喜欢
HashSet
还是
Distinct()
,都不要提及
ToList()
使比较变得不公平和琐碎。这里有很多内容,比如您是否需要更改通知、更新、筛选等……如果需要,则bindinglist是一个选项。@terrybozzio,不,没有这些。我只需要一个IEnumerable,可以用作数据源。可能的重复项
var data = xs.Select(s => s.y).Distinct();
chkBoxList.DataSource = data;