在HashSet上调用Distinct&lt;&gt;()<t> </t>

时间:2010-12-10 11:18:45

标签: c# .net linq

我只是好奇..当我在HashSet上调用Distinct&lt;&gt;()(来自Linq)时,.NET是否知道,这个IEnumerable总是包含不同的值集,并优化此调用?

3 个答案:

答案 0 :(得分:11)

通过Reflector查看代码判断,我不得不说。

代码最终会构造一个迭代器方法生成的类的实例,无论你给它什么类型。

此问题也因为您可以为Hashset和Distinct方法指定比较器对象这一事实而复杂化,这意味着优化仅在极少数情况下使用。

例如,在以下情况下,它实际上可以优化呼叫,但它无法知道:

var set = new HashSet<int>(new MyOwnInt32Comparer());
var distinct = set.Distinct(new MyOwnInt32Comparer());

因为我给它比较器类的两个实例,并且这样的类通常不实现相等方法,所以Distinct方法无法知道两个比较器实现实际上是相同的。

在任何情况下,这都是程序员比运行时更了解代码的情况,因此请充分利用它。 Linq可能非常好,但它不是无所不能的,所以请利用您的知识为您带来优势。

答案 1 :(得分:2)

我认为不,因为不同方法的Enumerable类的输入是IEnumerable,没有什么特定的确定它是一个哈希集(所以不要做任何事情)。

答案 2 :(得分:2)

不,查看反射器中的实现,它不会检查枚举是否为HashSet<T>。底层迭代器创建一个新集并在枚举期间填充它,因此开销不应该那么大。