.NET Dictionary: get or create new

后端 未结 8 1741
感情败类
感情败类 2020-12-08 13:38

I often find myself creating a Dictionary with a non-trivial value class (e.g. List), and then always writing the same code pattern when filling in data.

For example

相关标签:
8条回答
  • 2020-12-08 14:03

    Ok, different approach:

    public static bool TryAddValue<TKey,TValue>(this System.Collections.Generic.IDictionary<TKey,List<TValue>> dictionary, TKey key, TValue value)
        {
            // Null check (useful or not, depending on your null checking approach)
            if (value == null)
                return false;
    
            List<TValue> tempValue = default(List<TValue>);
    
            try
            {
                if (!dictionary.TryGetValue(key, out tempValue))
                {
                    dictionary.Add(key, tempValue = new List<TValue>());
                }
                else
                {
                    // Double null check (useful or not, depending on your null checking approach)
                    if (tempValue == null)
                    {
                        dictionary[key] = (tempValue = new List<TValue>());
                    }
                }
    
                tempValue.Add(value);
                return true;
            }
            catch
            {
                return false;
            }
        }
    

    In this way you have to "try to add" your value to a generic List of (obviously generalizable to a generic collection), null checking and trying to get existing key/values in your Dictionary. Usage and example:

    var x = new Dictionary<string,List<string>>();
    x.TryAddValue("test", null); // return false due to null value. Doesn't add the key
    x.TryAddValue("test", "ok"); // it works adding the key/value
    x.TryAddValue("test", "ok again"); // it works adding the value to the existing list
    

    Hope it helps.

    0 讨论(0)
  • 2020-12-08 14:04

    I am missing the GetOrAdd for Dictionary, that does exist for ConcurrentDictionary.

    ConcurrentDictionary<int,Guid> Conversion = new ConcurrentDictionary<int, Guid>();
    List<int> before = new List<int> { 1, 2, 1, 3 };
    List<Guid> after = before.Select(x => Conversion.GetOrAdd(x, Guid.NewGuid())).ToList();
    

    This code will generate Guids for each number. Ending up converting both 1's in before to the same Guid.

    In your case:

    ConcurrentDictionary<int, List<String>> dict;
    keyValues = dict.GetOrAdd(key, new List<String>());
    keyValues.Add(aValueForKey);
    
    0 讨论(0)
提交回复
热议问题