将LINQ查询的一部分传递给函数的参数?

7

我有以下C#代码示例,演示了我如何将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
从您的用例中,不清楚返回的对象是用于什么。 - GregC
2个回答

13
当然。您可以这样做:
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 方法需要执行其他操作,将谓词参数传递给该方法可能会更加合理。

看起来不错,但是我建议只在最后一刻使用IEnumerable<T>来执行查询。将具体的容器作为参数传递是不好的实践。 - GregC
我只是在重用他的类型。我同意,他应该使用 IEnumerable<T> - Daniel Hilgarth

1
你可以向该方法传递某种谓词:
var query = GetAll(x => x.ToString() == "lala");

// ...

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

那么我们应该像丹尼尔说的那样使用 Func<T, bool> 还是 Func<object, bool>? - Michiel Cornille
1
嗯,Daniel的版本更通用和灵活,但由于AllElements是一个List<object>,所以Func<object,bool>就足够了。 - LukeH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接