我正在改进这个答案,使用了我编写的一些扩展方法。第一个方法与@Bronek编写的方法类似,只是更加简洁。简单来说,如果键存在,则插入到已经存在的列表中(假设它已经初始化)。否则,将添加到列表中。
public static void AddToList<K, V>(this Dictionary<K, List<V>> multiValueDictionary,
K key,
V value)
{
if (multiValueDictionary.TryGetValue(key, out List<V> lst))
lst.Add(value);
else
multiValueDictionary.Add(key, new List<V> { value });
}
这个第二个函数是基于之前的一个函数。在 System.Linq 中,有一个扩展方法 ToDictionary 可以将任何 IEnumerable 转换为 Dictionary。但如果您有上述情况,即要为单个键存储多个值,那么下面的扩展将起作用!
public static Dictionary<K, List<V>> ToDictionaryValueList<T, K, V>(this IEnumerable<T> values, Func<T, K> keySelector, Func<T, V> elementSelector)
{
var tmp = new Dictionary<K, List<V>>();
foreach (var val in values)
tmp.AddToList(keySelector(val), elementSelector(val));
return tmp;
}
有了上述两个方法,现在可以轻松地将任何IEnumerable转换为这些字典之一。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Person> test = new List<Person>
{
new Person { Name = "Bob", Age = 22 },
new Person { Name = "Bob", Age = 28 },
new Person { Name = "Sally", Age = 22 },
new Person { Name = "Sally", Age = 22 },
new Person { Name = "Jill", Age = 22 },
}
Dictionary<string, List<int>> results = test.ToDictionaryValueList((p) => p.Name, (p) => p.Age);
results.AddToList("Jill", 23);
需要考虑的一件事是,重复值不会被处理,这符合标准的
List
的预期。如果需要,您可以为不同的集合(如
HashSet
)编写扩展方法。
Lookup
е®һзҺ°гҖӮеӨ§йғЁеҲҶйҖ»иҫ‘е·Із»ҸеӯҳеңЁпјҢеҸӘжҳҜж— жі•ж·»еҠ йЎ№зӣ®гҖӮ - Jeff Mercado