2011-04-07 107 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

相关问题