首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在.NET中只允许唯一项的集合?

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

Stack Overflow用户
提问于 2011-03-02 01:08:01
回答 5查看 109.9K关注 0票数 125

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);
    }
}

下面的代码将(显然)抛出一个异常:

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);

但是,有没有一个类可以同样保证唯一性,但是没有KeyValuePairs呢?我原以为HashSet<T>会这么做,但看过文档后发现,这个类似乎只是一个集合实现(请看图)。

EN

回答 5

Stack Overflow用户

发布于 2012-07-04 04:14:37

public static void AddOrThrow<T>(this HashSet<T> hash, T item)
{
    if (!hash.Add(item))
        throw new ValueExistingException();
}
票数 18
EN

Stack Overflow用户

发布于 2011-03-02 01:13:55

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-03-02 03:03:55

我只想补充我的两分钱。

如果您需要抛出ValueExistingException的HashSet<T>,您还可以轻松地创建您的集合:

public class ThrowingHashSet<T> : ICollection<T>
{
    private HashSet<T> innerHash = new HashSet<T>();

    public void Add(T item)
    {
        if (!innerHash.Add(item))
            throw new ValueExistingException();
    }

    public void Clear()
    {
        innerHash.Clear();
    }

    public bool Contains(T item)
    {
        return innerHash.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        innerHash.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return innerHash.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(T item)
    {
        return innerHash.Remove(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return innerHash.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

这可能是有用的,例如,如果您在许多地方需要它...

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5157787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档