2010-07-05 73 views
2

我正在創建一個從Foo到Baa的一對一映射的集合。我可以使用LINQ來改進此算法嗎?

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列表替換字典。

謝謝。

+3

的LINQ總是比foreach循環慢(由於增加的開銷)。如果你的foreach循環工作,堅持下去。 – 2010-07-05 10:47:41

+0

@Herbie:在大多數情況下,性能不如可讀性重要。不過,我還沒有找到一個更可讀的LINQ版本。 =) – Jens 2010-07-05 10:51:02

+1

可讀性是主觀的,對吧?對我來說,foreach版本是最具可讀性的。 – 2010-07-05 11:00:59

回答

0

Summerising所有的意見和答案,我們得到:

速度:使用LINQ實際上是慢。

可讀性:這是一個主觀觀點,但我同意所有意見,指出原始的foreach循環是最具可讀性的。

我要堅持原來的代碼。

感謝您的所有答案。

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); 
} 
5

你可以使用

var mappings = (from baa in CollectionOfBaa 
       from foo in baa.CollectionOfFoo 
       select new { foo, baa }).ToDictionary(e => e.foo, e=> e.baa); 
+1

哇,真棒無效。做3個foreach循環,創建n個臨時對象並調用n * 2次匿名函數。 它甚至不增加可讀性(恕我直言)。 – 2010-07-05 16:34:39

2

改善怎麼樣?性能? 。可讀性? 不適合我

嗯,也許這是爲了可讀性(我仍然喜歡foreach版本)?

CollectionOfBaa.ForEach(baa => 
    baa.ForEach(foo => 
     mappings.Add(foo, baa))); 
0

由於KeyValuePairs是可以接受的,可以考慮將IEnumerable其中:

var mappings = from parent in CollectionOfBaa 
       from child in parent.CollectionOfFoo 
       select new KeyValuePair<Foo,Baa>(child, parent); 
相關問題