我可以使用LINQ改进此算法吗?

时间:2010-07-05 10:40:48

标签: c# linq

我正在创建一个从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列表替换字典。

感谢。

5 个答案:

答案 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);