我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是否有办法做到这一点?
答案 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 s
和string 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);
}