我发现自己经常写这篇文章。
Hashtable h = new Hashtable();
string key = "hahahahaahaha";
string value = "this value";
if (!h.Contains(key))
{
h.Add(key, value);
}
是否有一个本机方法(可能类似于AddIf()??)检查它是否存在于集合中,如果不存在,则将其添加到集合中?那么我的例子将改为:
Hashtable h = new Hashtable();
string key = "hahahahaahaha";
string value = "this value";
h.AddIf(key, value);
这适用于Hastable之外。基本上任何具有.Add方法的集合。
编辑:更新为在添加到Hashtable时添加值:)
答案 0 :(得分:13)
好吧,你可能不会写那个代码,因为Hashtable
使用键/值对,而不只是键。
如果您使用的是.NET 3.5或更高版本,我建议您使用HashSet<T>
,然后您可以无条件地调用Add
- 返回值将指示它是否实际添加。
ConcurrentDictionary
IIRC,但......),但如果您很乐意覆盖现有值,您只需使用索引器:
h[key] = value;
与Add
不同,如果已经存在密钥条目,则不会抛出异常 - 它只会覆盖它。
答案 1 :(得分:8)
.NET框架中没有这样的方法。但是您可以轻松编写自己的扩展方法:
public static void AddIfNotExists<T>(this ICollection<T> coll, T item) {
if (!coll.Contains(item))
coll.Add(item)
}
对于IDictionary,我使用此方法(通常用于Dictionary<TKey, List<TValue>>
和变体):
public static TValue AddIfNotExists<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key)
where TValue : new()
{
TValue value;
if (!dict.TryGetValue(key, out value))
{
value = new T();
dict.Add(key, value);
}
return value;
}
答案 2 :(得分:2)
对于哈希表,您可以写myHashtable[key] = myHashtable[key] ?? newValue
,右侧首先检查myHashtable[key]
是否评估为空,如果不解决,则解析为newVale
答案 3 :(得分:1)
您的代码没有意义,因为HashTable需要密钥和值。
如果您的意思是HashSet<T>
,如果该项目已经存在,则调用Add
将不会执行任何操作。
如果您的意思是Dictionary<TKey, TValue>
,则可以编写dict[key] = value
,如果密钥不存在则会添加密钥,如果密钥是,则会覆盖密钥。
答案 4 :(得分:0)
到目前为止它没有。但是你可以编写自己的扩展方法将它包装在一行中。
答案 5 :(得分:0)
我经常在自定义的Dictionary / Hashtable集合中编写一个类似的方法
Type FetchOrCreate(Key)
,而不是void AddIf(Key)