【发布时间】:2012-06-07 14:28:54
【问题描述】:
为什么 HashSet 不能包含重复项时有可用的 Distinct() 方法?
【问题讨论】:
为什么 HashSet 不能包含重复项时有可用的 Distinct() 方法?
【问题讨论】:
Distinct方法不在HashSet<>上,而是在HashSet<>实现的IEnumerable<>上。
扩展方法不能从某些类型中“省略”。一旦添加到一个类型,所有该类型和任何派生都将获得扩展方法。
只是为了演示一下,如果您扩展 object,如果您添加了相关的命名空间,您会乱扔所有东西。所以不要去添加:
namespace System
{
public static class ObjectExtensions
{
public static void Garbage(this object foo)
{
}
}
}
【讨论】:
Distinct是IEnumerable<T>上的扩展方法,HashSet<T>恰好实现了。
Distinct 是一个扩展方法,扩展了IEnumerable<> 并驻留在静态类System.Linq.Enumerable 中。
interface,会产生同样的问题。但是如果 HashSet 定义了自己的Distinct 方法,扩展方法就会被隐藏起来,给优化提供了可能