如何在此方法中将Lambda表达式用作参数并在where子句中使用它?
一直在阅读有关Func,动态和表达式树的内容,但不知道如何执行此操作。
问题是我不知道类型T并且不知道调用者想要返回什么。 我怎样才能在C#4.0中这样做? 让我入门的一个例子很棒 - 谢谢。
这是我想要的一个非常简化的例子。
static public List<T> Match(string startfilelocation, ???)
{
var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories);
return filelist.Where(???);
}
谢谢。
答案 0 :(得分:1)
static public IEnumerable<string> Match(string startfilelocation,Func<string,bool> selector)
{
var filelist = Directory.GetFiles(startfilelocation, ".", SearchOption.AllDirectories);
return filelist.Where(selector);
}
我也建议Directory.EnumerateFiles
而不是使用GetFiles
不要将所有文件名加载到内存
答案 1 :(得分:1)
指定List<string>
作为返回类型,使用Func<string, bool>
类型作为参数,然后使用ToList
方法将结果转换为列表:
static public List<string> Match(string startfilelocation, Func<string, bool> filter) {
var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories);
return filelist.Where(filter).ToList();
}
示例:
List<string> files = Match(folder, s => s.Contains("candy"));
答案 2 :(得分:0)
LINQ中的Where方法只能接受两个参数Func<TSource,bool>
和Func<TSource,int,bool>
。在您filelist
为string[]
的情况下,您可以使用两个重载方法
static public IEnumerable<string> Match(string startfilelocation, Func<string,bool> predicate)
{
var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories);
return filelist.Where(predicate);
}
static public IEnumerable<string> Match(string startfilelocation, Func<string,int,bool> predicate)
{
var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories);
return filelist.Where(predicate);
}