我有一个由多个类型元素组成的结构,如下所示:
public struct mystruct
{
int key;
string value;
}
将此结构的列表转换为键为mystruct.key
且值为mystruct.value
列表的字典的最有效方法是什么?
我将其实现如下
Dictionary<int, List<string>> mydictionary = new Dictionary<int, List<string>>();
foreach (var item in mystruct_list)
{
if (!mydictionary.ContainsKey(item.key))
mydictionary.Add(item.key, new List<string>());
mydictionary[item.key].Add(item.value);
}
答案 0 :(得分:0)
假设存在mystruct对象的集合并且键和值字段是公共的,则可以使用以下代码:
List<mystruct> myElements ... //just declaration
var result = myElements
.GroupBy(c => c.key)
.ToDictionary(
c => c.Key,
c => c.Select(i => i.value).ToList());
答案 1 :(得分:0)
如果您放宽了使用IEnumerable<string>
而不是IList<string>
作为值的要求,则查找就是您要查找的东西(内部实现了,因此不必担心会多次枚举) )。
IEnumerable<mystruct> source = // ...
var lookup = x.ToLookup(c => c.key, c => c.value);
foreach (var g in lookup)
Console.WriteLine($"Key: {g.Key}, Values: {string.Join(", ", g)}");
查找的好处是它们支持查找
var group3 = lookup[3];
,并且当您使用不存在的密钥进行访问时,这将为您提供一个空序列,而不是向您抛出KeyNotFoundException
。
答案 2 :(得分:0)
基于内存中已经有200万个键和每个键20个值的假设,这就是我要做的:
var d = new Dictionary<int, List<string>>();
foreach (var s in mystruct_list)
{
if (!d.TryGetValue(s.key, out List<string> list))
{
list = new List<string>();
d[s.key] = list;
}
list.Add(s.value);
}
这应该导致4200万个字典索引读取:TryGetValue
的字典索引读取为4000万(20 * 2百万),加上首次存储列表时的200万索引读取。
您的版本进行8200万次索引读取:对于20 * 2百万个值中的每一个,它都同时调用ContainsKey()
和mydictionary[item.key]
,因此为20 * 2 * 2百万,另外还有200万添加列表。
(代码应该大致正确,距离我编写C#已有很长时间了)