只允许.NET中的唯一项目的集合?

Ada*_*kis 98 c# set hashset

C#中是否有一个集合不允许您向其添加重复项?例如,与愚蠢的类

public class Customer {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }

    public override int GetHashCode() {
        return (FirstName + LastName + Address).GetHashCode();
    }

    public override bool Equals(object obj) {
        Customer C = obj as Customer;
        return C != null && String.Equals(this.FirstName, C.FirstName) && String.Equals(this.LastName, C.LastName) && String.Equals(this.Address, C.Address);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下代码(显然)将抛出异常:

Customer Adam = new Customer { Address = "A", FirstName = "Adam", LastName = "" };
Customer AdamDup = new Customer { Address = "A", FirstName = "Adam", LastName = "" };

Dictionary<Customer, bool> CustomerHash = new Dictionary<Customer, bool>();
CustomerHash.Add(Adam, true);
CustomerHash.Add(AdamDup, true);
Run Code Online (Sandbox Code Playgroud)

但有没有一个类同样保证唯一性,但没有KeyValuePairs?我认为HashSet<T>会这样做,但是阅读了文档后,似乎该类只是一个集合实现(如图).

Don*_*nut 197

HashSet<T>是你在找什么.来自MSDN(重点补充):

HashSet<T>类提供高性能的设置操作.集合是一个不包含重复元素的集合,其元素没有特定的顺序.

请注意,如果项目已添加到集合中,则该HashSet<T>.Add(T item)方法返回bool- 如果该项目已经存在.truefalse

  • 在这种情况下,T项目应实现IEquatable接口。如果class不继承此接口,则HashSet &lt;T&gt;添加重复的元素。 (5认同)
  • 或者,代替实现 `IEquatable` 的项目,您可以将 `EqualityComparer&lt;T&gt;` 实例的(自定义)实现传递给 `HashSet&lt;T&gt;` 构造函数。 (3认同)

Jon*_*art 17

在HashSet上只是一个扩展方法怎么样?

public static void AddOrThrow<T>(this HashSet<T> hash, T item)
{
    if (!hash.Add(item))
        throw new ValueExistingException();
}
Run Code Online (Sandbox Code Playgroud)


Ode*_*ded 13

HashSet<T>MSDN上的页面:

HashSet(Of T)类提供高性能的集合操作.集合是一个不包含重复元素的集合,其元素没有特定的顺序.

(强调我的)


小智 5

如果您需要的只是确保元素的唯一性,那么 HashSet 就是您所需要的。

当你说“只是一套实施”时,你是什么意思?集合(根据定义)是不保存元素顺序的唯一元素的集合。