.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);
}
}
}
答案 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
ICollection
和IList
接口,因此即使在期望这些接口的系统中也可以用作实现接口
答案 2 :(得分:0)
要添加到Bjorn的答案,如果您还需要IList.AddRange
类型的功能HashSet<T>
这样的功能,您可以使用HashSet<T>.UnionWith
({ {3}}):
修改当前HashSet对象以包含其自身,指定集合或两者中存在的所有元素。
public void UnionWith(
IEnumerable<T> other
)
唯一的问题可能是:我非常确定这需要.NET Framework 3.5 SP1及更高版本。