Собственный метод C # .NET для проверки наличия элемента в коллекции перед добавлением - PullRequest
7 голосов
/ 24 ноября 2010

Я часто пишу это.

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 ]

14 голосов
/ 24 ноября 2010

Ну, вы, вероятно, не пишете этот код, потому что Hashtable использует пары ключ / значение, а не только ключи.

Если выиспользуя .NET 3.5 или выше, я предлагаю вам использовать HashSet<T>, а затем вы можете просто безоговорочно вызвать Add - возвращаемое значение будет указывать, действительно ли оно было добавлено или нет.

РЕДАКТИРОВАТЬ: Хорошо, теперь мы знаем, что вы говорите о парах ключ / значение - нет ничего встроенного для условного добавления (ну, есть в ConcurrentDictionary IIRC, но ...),но если вы готовы перезаписать существующее значение, вы можете просто использовать индексатор:

h[key] = value;

В отличие от Add, это не вызовет исключения, если для ключа уже есть запись - этоперезапишу.

8 голосов
/ 24 ноября 2010

В .NET Framework такого метода нет. Но вы можете легко написать свой собственный метод расширения:

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 голосов
/ 24 ноября 2010

Для хеш-таблицы вы можете написать myHashtable[key] = myHashtable[key] ?? newValue, где правая часть сначала проверит, оценивается ли myHashtable[key] как ноль, а если нет, то в противном случае разрешается newVale

1 голос
/ 24 ноября 2010

Ваш код не имеет смысла, так как HashTable требует и ключ, и значение.

Если вы имели в виду HashSet<T>, то вызов Add ничего не изменит, если элемент уже существует.

Если вы имели в виду Dictionary<TKey, TValue>, вы можете написать dict[key] = value, который добавит ключ, если его нет, или перезапишет его, если он есть.

0 голосов
/ 24 ноября 2010

Я часто пишу подобный метод в своих пользовательских коллекциях Dictionary / Hashtable, как Type FetchOrCreate(Key), а не как void AddIf(Key)

0 голосов
/ 24 ноября 2010

Пока что нет. Но вы можете написать свой собственный метод расширения, чтобы обернуть его в одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...