如何在C#4中对T执行lambda?

时间:2012-04-13 08:15:06

标签: c# linq func

如何在此方法中将Lambda表达式用作参数并在where子句中使用它?

一直在阅读有关Func,动态和表达式树的内容,但不知道如何执行此操作。

问题是我不知道类型T并且不知道调用者想要返回什么。 我怎样才能在C#4.0中这样做? 让我入门的一个例子很棒 - 谢谢。

这是我想要的一个非常简化的例子。

static public List<T> Match(string startfilelocation, ???)
{
    var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories);
    return filelist.Where(???);
}

谢谢。

3 个答案:

答案 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>。在您fileliststring[]的情况下,您可以使用两个重载方法

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);
}