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

Sal*_*oga 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想把它变成一个字典,其中键将是每个字符串,aliases并且值将是action.例如,如果我有两个MyStruct对象IEnumerable,第一个有别名"o", "on", "one"和动作a1,第二个有别名"t", "tw", "two"和动作a2,我希望结果字典看起来像这样:

    {"o",   a1},
    {"on",  a1},
    {"one", a1},
    {"t",   a2},
    {"tw",  a2},
    {"two", a2}
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*ogt 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);
Run Code Online (Sandbox Code Playgroud)

第一个参数来SelectMany告诉它来选择aliases,所以第二拉姆达被每一个信息MyStruct s和每一个string alias的那个MyStruct,并创建一个实例了这两个值.

最后,使用aliasas键和actionas值将此序列转换为字典.

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