2011-04-07 106 views
6

我在C#中有以下代碼示例,演示瞭如何將一些LINQ查詢解析爲函數的參數。將一些LINQ查詢傳遞給一個函數的參數?

public List<object> AllElements; 

public object GetAll<T>(SomeLINQQuery) { 

    //get some elements from AllElements where the argument is added to the query, as shown below. 

} 

而現在,給這個有些意思,我在想什麼完成將是這樣的:

public void test() { 
    GetAll<object>(where object.ToString() == "lala"); 
} 

這是一種很難解釋。我希望這個例子能夠做得很好。

+1

我喜歡你提供一個用例。如果有用例,通常可以編寫代碼使整個工作起作用:) – GregC 2011-04-07 09:24:12

+0

從你的用例中,不清楚返回的對象是什麼。 – GregC 2011-04-07 09:25:42

回答

11

當然。你會做這樣的:

public List<T> GetAll<T>(List<T> list, Func<T, bool> where) 
{ 
    return list.Where(where).ToList(); 
} 

你會這樣稱呼它:

var result = GetAll(AllElements, o => o.ToString() == "lala"); 

你甚至可以把它創建爲一個擴展方法:

public static List<T> GetAll<T>(this List<T> list, Func<T, bool> where) 
{ 
    return list.Where(where).ToList(); 
} 

,並調用它像這樣:

var result = AllElements.GetAll(o => o.ToString() == "lala"); 

但是真的,在簡單的例子,它沒有任何意義,因爲它是完全一樣直接使用Where

var result = AllElements.Where(o => o.ToString() == "lala").ToList(); 

但是,如果你的GetAll方法做一些更多的東西,它可能是有意義的傳遞謂詞到那個方法。

+0

看起來不錯,但我推遲使用IEnumerable 代替查詢的實際執行到最後一刻。以混凝土容器爲參數是一種不好的做法。 – GregC 2011-04-07 09:22:02

+0

我只是在重複使用他的類型。我同意,他應該使用'IEnumerable '代替。 – 2011-04-07 09:23:42

+0

令人驚歎!非常感謝 – 2017-11-09 19:26:13

1

你可以通過某種形式的謂語的方法:

var query = GetAll(x => x.ToString() == "lala"); 

// ... 

public IEnumerable<object> GetAll(Func<object, bool> predicate) 
{ 
    return AllElements.Where(predicate); 
} 
+0

所以,我們應該用Func鍵像丹尼爾說或FUNC。<對象,布爾> – 2011-04-07 10:34:40

+1

好,丹尼爾的版本是更通用的,靈活的,但因爲'AllElements'是'名單'然後'Func鍵'就足夠了。 – LukeH 2011-04-07 10:53:08

相關問題