将结构列表转换为字典的最有效方法是什么?

时间:2019-05-29 11:07:53

标签: c#

我有一个由多个类型元素组成的结构,如下所示:

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);
            }

3 个答案:

答案 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#已有很长时间了)

相关问题