2012-04-10 55 views
0

是否可以在此添加另一個where子句,還是需要創建另一個foreach?如何在此foreach上添加另一個where子句?

foreach (Point point in _Points.Where(x => x.Name == "Test")) 
{ 
} 

基本上我也想補充的是,其中x.name = "Test" & &其中!x.asset.StartsWith("INV")

+13

我相信你已經回答了你自己的問題:'x => x.Name ==「Test」&&!x.asset.StartsWith(「INV」)' – dlev 2012-04-10 19:46:17

+0

good call !!! : - | – mameesh 2012-04-10 19:48:50

+0

當你嘗試時發生了什麼? – gdoron 2012-04-10 19:50:03

回答

8

你可以把它在同一個WHERE子句:

foreach (Point point in _Points.Where(x => x.Name == "Test" && !x.Asset.StartsWith("INV")) 
{ 
+0

你錯過了'x'。即x => x.Name'。 – 2012-04-10 19:47:47

+0

我已將此部分添加到此答案。 – 2012-04-10 19:49:07

+1

@ChuckNorris謝謝;) – 2012-04-10 19:52:04

0

以上就可以了,但你也可以做

_Points.Where(x => x.Name == "Test" && !x.Asset.StartsWith("INV")).ToList().ForEach(yourmethod()); 
+1

這將與ToList()調用一起工作,但我認爲這是一個非常糟糕的主意......我推薦閱讀:http://blogs.msdn.com/b/ericlippert /archive/2009/05/18/foreach-vs-foreach.aspx – 2012-04-10 19:52:49

+0

現在,它的工作原理!但我仍然認爲這是一種更糟糕的方法:爲什麼在不需要時分配內存? 「foreach」循環已經很可讀了。如果你把查詢放在一個變量中,甚至更多:'foreach(myQuery中的var項){..}'非常簡單。 – dlev 2012-04-10 19:54:10

+0

我認爲我們在這裏流利與功能領域。 :) – Maess 2012-04-10 19:56:30

1

是你可以爲一個更加其中這裏在

foreach (Point point in _Points.Where(x => x.Name == "Test") 
           .Where(x=>!x.asset.StartsWith("INV"))) 
    { 

    } 

或更好的去

foreach (Point point in _Points.Where(x => x.Name == "Test" && !x.asset.StartsWith("INV"))) 
    { 

    } 
3

你也可以連接在LINQ運營商

foreach (Point point in _Points 
    .Where(x => x.Name == "Test") 
    .Where(x => !x.asset.StartsWith("INV"))) 
{ 

} 

有時我覺得它更可讀與Where鏈接,而不是在一個表達式中混入大量的&&

另外請注意,在這種情況下,良好的換行可以提高可讀性。

+0

我喜歡這樣,這是否會減慢性能而不是上述答案? – mameesh 2012-04-10 19:55:45

+0

你不會注意到任何區別。優先考慮可讀性,直到你證明某段代碼實際上太慢。 – 2012-04-10 19:59:38

+0

@mameesh不要過早優化。如果某個應用程序正在慢慢查找可以改進的地方,並比較每次開發人員小時的性能改進情況。這裏的性能差異很小,以至於不可能有足夠的重要性來打擾。 – Servy 2012-04-10 20:02:06