2011-11-19 49 views
3

我有一個簡單的物體,像這樣LINQ方法參數

public class Test 
{ 
    public string Name {get; set;} 
} 

後來我有List<Test> tests

後來才知​​道有這確實與在列表中Test對象的東西的方法。

private void DoSomething(Test test) 
{ 
    //do some serious stuff here! 
} 

然後在applciation,這Test對象將被在一個TreeView填充和用戶點擊他們後,他們將被傳遞到上述方法。在我發現選擇樹節點像這樣的時刻:

string name = selectedNode.Text; 

foreach(Test test in tests) 
{ 
    if (test.Name = name) DoSomething(test); 
} 

這樣的想法是,我不能想出一個辦法,在方法的參數,而不是做枯燥的foreach循環使用LINQ。

this.DoSomething(from x in tests where x.Name = "What I need to pass" select x) 

有什麼不對?

謝謝!

+0

我敢肯定你不能在方法中使用LINQ作爲參數,就像你不能使用匿名類型一樣。 – Tim

+0

即使我在參數中的linq之前施放(測試)? –

+0

對不起,我的意思是在foreach循環中:'if(test.Name = name)DoSomething(test);' –

回答

4
this.DoSomething(tests.FirstOrDefault(x=>x.Name=="What I need to pass")) 
+0

老兄,這很聰明! –

1

您在這裏有效地進行搜索。在IQueriable對象

var selectedTest = tests.SingleOrDefault(test => test.Name == selectedNode.Text); 
if (selectedTest != null) 
{ 
    DoSomething(selectedTest); 
} 
+0

那麼這與我已經在做的foreach循環沒有太大的區別。我正在尋找直接使用linq作爲參數。 –

+1

這和使用foreach循環有什麼不同?驗證?你爲什麼想要忽略它?海事組織最好在調用你的私有方法之前進行驗證,而不是在其中進行驗證。 –

+0

是的,你是對的驗證...它不應該被忽略。我只是在參數中使用linq。 –

1

LINQ查詢結果:假設名稱是唯一的,你可以做到這一點。所以你可以用它作爲參數。

1

下面的代碼段將工作。我不會推薦它,但除非您在DoSomething方法中檢查了空的情況。您應該首先運行LINQ查詢存儲結果,並在將它們傳遞給新方法之前檢查它們。

this.DoSomething(
    (from x in tests 
     where x.Name = "What I need to pass" 
     select x).FirstOrDefault() as Test);