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有没有办法做到这一点?
您可以使用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如果别名不唯一,则会引发一个,因为您无法将相同的键添加到字典中两次.