带有键和值列表的字典
本文关键字:字典 列表 键和值 | 更新日期: 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;
}
它的作用:
- 将
_collection
分解为键/值对 - 将其与转换为键/值对的
_registeredValues
连接起来 - 按
Key
分组 - 把它转换回字典
如果_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;
}