在添加之前检查项目是否存在于集合中的本地C#.NET方法

时间:2010-11-24 13:56:41

标签: c# collections

我发现自己经常写这篇文章。

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时添加值:)

6 个答案:

答案 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)