2010-01-26 20 views
2

鑑於以下兩種情況,哪一種更可取(如果它們都不好,那麼採用完全不同的方式也是一種選擇)?轉換不好?

Convert.ToInt32稱爲Where

var items = GetItems(); 
if (aDropDownList.SelectedIndex > 0) 
{ 
    items = items.Where(x => 
      x.IntProperty == Convert.ToInt32(aDropDownList.SelectedValue)); 
} 

Convert.ToInt32調用之前Where

var items = GetItems(); 
if (aDropDownList.SelectedIndex > 0) 
{ 
    int selectedDropDownValue = Convert.ToInt32(aDropDownList.SelectedValue); 
    items = items.Where(x => x.IntProperty == selectedDropDownValue); 
} 
+2

順便說一句,只要調用'Where'就很少,除非你得到結果。 – 2010-01-26 17:45:40

+0

我認爲你只需要在文本和代碼段之間增加一個換行符。 – Brandon 2010-01-26 17:45:58

+0

@Marc,添加了「Where()」結果的賦值。 – jball 2010-01-26 18:01:55

回答

2

我寧願第二。它只進行一次轉換,而不是多次轉換。但是,除非這是一個性能至關重要的代碼片段(不太可能;它看起來像GUI代碼),否則您將不會注意到其中的差異。

+0

正如你猜測(下拉是一個贈品)的GUI代碼 - 然而,之前添加轉換是很難的,我希望在整個代碼中以相同的方式做事,所以我傾向於第二種情況以及。 – jball 2010-01-26 18:10:03

2

我能看到的唯一區別是編譯器如何生成lambda。在第二個版本中,該值被捕獲並且未被引用,並且這將在多線程環境中產生效果。

+0

啊 - 但捕獲是在這個線程,所以它是安全的。但在第一個示例中,下拉菜單可能會在過濾的一半中更改值。 – 2010-01-26 18:55:51

+0

@大衛B - 對,在這種情況下,它是,但不是在一般情況下。 – codekaizen 2010-01-26 19:05:02

3

這些都具有一個缺陷 -

你呼籲收集.Where(...),但什麼都不做的結果。這將不起任何作用,因爲Where不會更改原始集合 - 它會返回與謂詞相匹配的新項目IEnumerable<T>

也就是說,我更喜歡第二個選項 - 在第一個選項中,Convert.ToInt32調用將針對集合中的每個元素運行一次。在一個小集合中,這可能並不重要,但隨着集合變大,它會變慢。

您可能會也可能不會注意到這種情況的差異,但是在使用LINQ語句之前聲明您的變量是(IMO)的一個好習慣。我經常看到人們認爲LINQ速度慢的情況僅僅是因爲他們在謂詞中做了昂貴的計算。在這種情況下,你的方法相對較快,所以它可能無關緊要,但作爲一種習慣,遵循第二種模式是一種好習慣。

+0

(我已經在問題的例子中添加了Where()'結果)我傾向於第二個案例,但我不確定它是否是不必要的,我知道簡潔的代碼是有價值的太... – jball 2010-01-26 18:03:12

+1

這不是「必要的」 - 編譯和功能都很好。第二種情況效率更高,這可能也可能沒有關係。但總的來說,我個人總是試圖高效地實踐編碼模式,然後在出現問題時才進一步優化。 – 2010-01-26 18:07:41