将内部IEnumerable的IEnumerable结构转换为单个字典

时间:2016-09-12 09:14:48

标签: c# linq dictionary

IEnumerable<MyStruct>MyStruct如下所示:

struct MyStruct
{
    public IEnumerable<string> aliases;
    public Action action;
    public MyStruct(IEnumerable<string> aliases, Action action)
    {
        this.aliases = aliases;
        this.action = action;
    }
}

我想把它变成一个字典,其中键是来自aliases的每个字符串,值将是action。例如,如果我的MyStruct中有两个IEnumerable个对象,则第一个包含别名"o", "on", "one"和操作a1,第二个包含别名"t", "tw", "two"和action { {1}},我希望结果字典看起来像这样:

a2

我想知道Linq是否有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

您可以使用SelectMany展平别名列表,并创建包含别名和操作的临时匿名类型。最后转换此展平列表ToDictionary

IEnumerable<MyStruct> source = ...
Dictionary<string, Action> result = 
    source.SelectMany(s => s.aliases, (s, alias) => new { Alias = alias, s.action })
          .ToDictionary(x => x.Alias, x => x.action);

SelectMany的第一个参数告诉它选择aliases,因此为MyStruct sstring alias的每个MyStruct调用第二个lambda。并从这两个值中创建一个实例。

最后,使用alias作为关键字并将action作为值,将此序列转换为字典。

请注意,如果别名不唯一,则会引发ArgumentException,因为您无法将相同的添加到字典中两次。

答案 1 :(得分:2)

Linq语法用于展平数据,然后是ToDictionary 您可以使用&#34; SelectMany&#34;平整数据。

private Dictionary<string, action> FlattenedStructs(IEnumerable<MyStruct> structs)
{
    var flattenedItems = from s in structs 
                         from a in s.aliases
                         select new {Alias = a, Action = s.action};
    return flattenedItems.ToDictionary(f => k.Alias, f => f.Action);
}