我正在创建一个从Foo到Baa的一对一映射的集合。
Baa包含一系列Foo的唯一实例。
这是完成工作的一些代码:
Dictionary<Foo, Baa> mappings = new Dictionary<Foo, Baa>();
foreach (Baa baa in CollectionOfBaa)
{
foreach (Foo foo in baa.CollectionOfFoo)
{
mappings.Add(foo, baa);
}
}
使用LINQ有更好的方法吗?
我不喜欢用KeyValuePair列表替换字典。
感谢。
答案 0 :(得分:5)
您可以使用
var mappings = (from baa in CollectionOfBaa
from foo in baa.CollectionOfFoo
select new { foo, baa }).ToDictionary(e => e.foo, e=> e.baa);
答案 1 :(得分:2)
如何改进?性能? 否即可。可读性? 不适合我。
好吧,也许这是为了可读性(虽然我仍然喜欢foreach版本)?
CollectionOfBaa.ForEach(baa =>
baa.ForEach(foo =>
mappings.Add(foo, baa)));
答案 2 :(得分:1)
var keyValuePairs = from baa in CollectionOfBaa
from foo in baa.CollectionOfFoo
select new KeyValuePair(baa,foo);
foreach item in keyValuePairs
{
mappings.Add(item.key,item.Value);
}
答案 3 :(得分:0)
将我们获得的所有评论和答案夏化:
速度:使用LINQ实际上速度较慢。
可读性:这是一个主观点,但我同意所有的评论,说明原始的foreach循环是最具可读性的。
我会坚持使用原始代码。
感谢所有答案。
答案 4 :(得分:0)
由于KeyValuePairs是可以接受的,考虑一下它们的IEnumerable:
var mappings = from parent in CollectionOfBaa
from child in parent.CollectionOfFoo
select new KeyValuePair<Foo,Baa>(child, parent);