Этот старый ответ предлагает создать для этой цели метод расширения, но ответу 9 лет назад, поэтому C #, вероятно, отличается, поскольку то, или я не понимаю реализации.

Я сейчас пытаюсь это:

public static void AddIfNotPresent(this IDictionary<TKey, TValue> dict, TKey key, TValue value)
{
    if (!dict.ContainsKey(key))
    {
        dict.Add(value);
    }
}

... но Visual Studio говорит: "Тип или пространство имен TKey не могут быть найдены ...", то же самое для значения ... Почему я не могу добавить эти произвольные типы в метод расширения?

0
JacobIRR 20 Сен 2018 в 20:57

2 ответа

Лучший ответ

TKey и TValue должны быть параметрами типа AddIfNotPresent, а AddIfNotPresent должны быть определены в статическом классе.

void Main()
{
    var dictionary = new Dictionary<string, string>();
    dictionary.AddIfNotPresent("key", "value");
    Console.WriteLine($"{dictionary.First().Key} = {dictionary.First().Value}");

    // Output: key = value
}

public static class DictionaryExtensions
{
    public static void AddIfNotPresent<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, TValue value)
    {
        if (!dict.ContainsKey(key))
        {
            dict.Add(key, value);
        }
    }
}
3
Dan Wilson 20 Сен 2018 в 18:00

Ваш AddIfNotPresent не определяет эти общие типы / аргументы (AddIfNotPresent<TKey, TValue>). В этом ответе отсутствуют те, которые являются опечаткой.

0
Daniel A. White 20 Сен 2018 в 17:59