Словарь .NET и поиск добавляют / обновление

Я устаю делать блоки кода как это для различных битов кода, который я имею:

if (dict.ContainsKey[key]) {  
    dict[key] = value;  
}  
else {  
    dict.Add(key,value);  
}

и для поисков (т.е. ключ-> список значения)

if (lookup.ContainsKey[key]) {  
    lookup[key].Add(value);  
}  
else {  
    lookup.Add(new List<valuetype>);  
    lookup[key].Add(value);  
}  

Есть ли другой lib наборов или дополнительный метод, который я должен использовать, чтобы сделать это в одной строке кода, каковы ключ и типы значения?

например.

dict.AddOrUpdate(key,value)  
lookup.AddOrUpdate(key,value)
33
задан John Saunders 12 April 2010 в 07:19
поделиться

4 ответа

Как говорит Евгений, индексатор уже заменит существующие значения - поэтому, если вы просто хотите безоговорочно установить значение для данного ключа , вы можете сделать

dictionary[key] = value;

Более интересный случай - «получить значение или вставить его, если необходимо». Это легко сделать с помощью метода расширения:

public static TValue GetOrCreateValue<TKey, TValue>
    (this IDictionary<TKey, TValue> dictionary,
     TKey key,
     TValue value)
{
    return dictionary.GetOrCreateValue(key, () => value);
}

public static TValue GetOrCreateValue<TKey, TValue>
    (this IDictionary<TKey, TValue> dictionary,
     TKey key,
     Func<TValue> valueProvider)
{
    TValue ret;
    if (!dictionary.TryGetValue(key, out ret))
    {
        ret = valueProvider();
        dictionary[key] = ret;
    }
    return ret;
}

Обратите внимание на использование делегата для создания значения по умолчанию - это упрощает такие сценарии, как «список как значение»; вы не хотите создавать пустой список, если вам не нужно:

dict.GetOrCreateValue(key, () => new List<int>()).Add(item);

Также обратите внимание, что поиск выполняется только один раз, если ключ уже присутствует - нет необходимости выполнять ContainsKey и ], затем найдите значение. Однако при создании нового значения по-прежнему требуется два поиска.

35
ответ дан 27 November 2019 в 18:17
поделиться

При обновлении выполнять проверку не нужно. Просто используйте:

dict[key] = value

Он заменит любое существующее значение. К сожалению, для получения значения нет удобного единственного метода (например, setdefault в Python), но вы можете создать свой собственный метод расширения. Примерно так:

if (!lookup.TryGetValue(key, out value))
{
     value = new List<T>();
     lookup.Add(key, value);
}
14
ответ дан 27 November 2019 в 18:17
поделиться

В ConcurrentDictionary в .NET 4.0 есть этот красивый метод . Вы также можете написать для этого метод расширения.

4
ответ дан 27 November 2019 в 18:17
поделиться

Я не уверен, есть ли такой метод, как вы просите, но вы могли бы написать для него небольшую функцию или использовать исключение try catch, предположительно, если вы пытаетесь добавить уже существующее значение, это вызовет исключение. Если вы поймаете это и проигнорируете ... Просто предложение

1
ответ дан 27 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: