添加重复项时抛出异常的.NET集合

时间:2009-11-05 09:55:34

标签: .net collections unique duplicates

.NET框架(3.5)中是否有一个集合(除了字典),在添加副本时会抛出异常?

HashSet不会在此处抛出异常:

HashSet<string> strings = new HashSet<string>();
strings.Add("apple");
strings.Add("apple");

而词典确实:

Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("dude", "dude");
dict.Add("dude", "dude"); //throws exception
编辑:没有(Key,Value)这样的集合吗?如果可能的话我也想要AddRange ......

我自己动手:

public class Uniques<T> : HashSet<T>
{

    public Uniques()
    { }

    public Uniques(IEnumerable<T> collection)
    {
        AddRange(collection);
    }

    public void Add(T item)
    {
        if (!base.Add(item))
        {
            throw new ArgumentException("Item already exists");
        }
    }


    public void AddRange(IEnumerable<T> collection)
    {
        foreach (T item in collection)
        {
            Add(item);
        }
    }
}

3 个答案:

答案 0 :(得分:14)

但是如果值已经存在,HashSet.Add方法返回false - 还不够吗?

HashSet<string> set = new HashSet<string>();
...
if (!set.Add("Key"))
    /* Not added */

答案 1 :(得分:0)

如果您正在寻找AddRange样式功能,请查看C5。 C5系列中的集合在其接口中暴露了更多功能,包括一个带有可枚举的函数AddAll,依次将可枚举中的所有项添加到集合中。

编辑:另请注意,C5个集合在适当的位置实现System.Collections.Generic ICollectionIList接口,因此即使在期望这些接口的系统中也可以用作实现接口

答案 2 :(得分:0)

要添加到Bjorn的答案,如果您还需要IList.AddRange类型的功能HashSet<T>这样的功能,您可以使用HashSet<T>.UnionWith({ {3}}):

HashSet(T).UnionWith Method

  

修改当前HashSet对象以包含其自身,指定集合或两者中存在的所有元素。

public void UnionWith(
    IEnumerable<T> other
)

唯一的问题可能是:我非常确定这需要.NET Framework 3.5 SP1及更高版本。