带有键和值列表的字典

本文关键字:字典 列表 键和值 | 更新日期: 2023-09-27 18:25:38

如果关键字已经存在于_collection中,我不知道如何从registeredValues列表向字典_collection添加新值。我想向同一个键添加registeredValues中的另一个对象。或者我做错了?

private readonly List<ThreePropertyHolder<string, string, string>> _registeredValues = new List<ThreePropertyHolder<string, string, string>>();
private Dictionary<string, List<object>> _collection = new Dictionary<string, List<object>>();
public Dictionary<string, List<object>> BlaBlaMethod()
{
    foreach (var reValues in _registeredValues)
    {
        _collection.Add(reValues.Value2, new List<object>{reValues.Value3});
    }
}

带有键和值列表的字典

如果它正在添加或更新,则需要有不同的操作。使用TryGetValue查看该值是否存在,如果存在则更新字典。

public Dictionary<string, List<object>> BlaBlaMethod()
{
    foreach (var reValues in _registeredValues)
    {
        List<object> list;
        if(!_collection.TryGetValue(reValues.Value2, out list))
        {
            //The key was not there, add a new empty list to the dictionary.
            list = new List<object>();
            _collection.Add(reValues.Value2, list);
        }
        //Now, if we are adding or updating, we just need to add on to our list.
        list.Add(reValues.Value3);
    }
    return _collection;
}

如果有人感兴趣,可以使用LINQ版本:

public Dictionary<string, List<object>> BlaBlaMethod()
{
    _collection = _collection
        .SelectMany(x => x.Value, (x, y) => new { x.Key, Value = y })
        .Concat(_registeredValues.Select(x => new { Key = x.Value2, Value = (object)x.Value3 }))
        .GroupBy(x => x.Key, x => x.Value)
        .ToDictionary(x => x.Key, x => new List<object>(x));
    return _collection;
}

它的作用:

  1. _collection分解为键/值对
  2. 将其与转换为键/值对的_registeredValues连接起来
  3. Key分组
  4. 把它转换回字典

如果_collection被定义为Dictionary<string, List<string>>而不是Dictionary<string, List<object>>,这将稍微简单一些。这将消除强制转换为object的需要,并且您可以只执行x.ToList()而不执行new List<object>(x)

通过检查键是否已经存在,您可以选择是添加还是更新条目。根据你的样本,它应该是这样工作的。

private readonly List<ThreePropertyHolder<string, string, string>> 
            _registeredValues = new List<ThreePropertyHolder<string, string, string>>();
private Dictionary<string, List<object>> _collection = new 
            Dictionary<string, List<object>>();
public Dictionary<string, List<object>> BlaBlaMethod()
{
    foreach (var reValues in _registeredValues)
    {
        if (_collection.ContainsKey(reValues.Value2))
        {
           _collection[reValues.Value2].Add(someOtherObject);
        }
        else
        {
           _collection.Add(
               reValues.Value2, 
               new List<object> { reValues.Value3 }
           );
        }
    }
    return _collection;
}