Словарь C # <> отсутствует ключ - PullRequest
2 голосов
/ 05 апреля 2009

Когда я делаю val = dict ["несуществующий ключ"], я получаю System.Collections.Generic.KeyNotFoundException Есть ли способ, чтобы мой словарь вызывал функцию-член с ключом в качестве параметра для генерации значения?

-edit- Может быть, я должен был быть более конкретным. Я хочу, чтобы АВТОМАТИЧЕСКИ вызывать функцию-член, чтобы сделать то, что ей нужно, создать правильное значение для этого ключа. В этом случае он делает запись в моей БД, затем возвращает мне свой уникальный дескриптор. Ниже я опубликую свое решение.

Ответы [ 7 ]

18 голосов
/ 05 апреля 2009

Используйте метод расширения:

static class DictionaryExtensions {
   public static TValue GetValueOrDefault<TKey, TValue>(this Dictionary<TKey,TValue> dic, TKey key, Func<TKey, TValue> valueGenerator) {
      TValue val;
      if (dic.TryGetValue(key, out val))
         return val;
      return valueGenerator(key);
   }
}

Вы можете позвонить с помощью:

dic.GetValueOrDefault("nonexistent key", key => "null");

Или передать функцию-член:

dic.GetValueOrDefault("nonexistent key", MyMemberFunction);
14 голосов
/ 05 апреля 2009
Object value;
if(dict.TryGetValue("nonexistent key", out value))
{
    // this only works when key is found..
}
// no exception is thrown here..
2 голосов
/ 06 апреля 2009

Кстати, техника, о которой вы говорите, называется Memoization

1 голос
/ 05 апреля 2009
if(myDictionary.ContainsKey("TestKey") 
{       
  System.Print(myDictionary["TestKey"]); 
}
1 голос
/ 05 апреля 2009

TryGetValue () - это хорошо. Вы также можете использовать ContainsKey (), если у вас нет ограничений по производительности или вам не нужно это значение.

0 голосов
/ 06 апреля 2009
public class MyDictionary<K, V>
{
    Dictionary<K, V> o = new Dictionary<K, V>();
    public delegate V NonExistentKey(K k);
    NonExistentKey nonExistentKey;
    public MyDictionary(NonExistentKey nonExistentKey_)
    {   o = new Dictionary<K, V>();
        nonExistentKey = nonExistentKey_;
    }

    public V this[K k]
    {
        get {
            V v;
            if (!o.TryGetValue(k, out v))
            {
                v = nonExistentKey(k);
                o[k] = v;
            }
            return v;
        }
        set {o[k] = value;}
    }

}

0 голосов
/ 05 апреля 2009
    string Q = "nonexistent key";
    string A = "";


    if(dict.containskey(Q))
    {
        A= dict[Q];
    }
    else
    {
       //handler code here
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...