2

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

一直在阅读有关 Func、动态和表达式树的信息,但不知道如何做到这一点。

问题是我不知道类型 T 也不知道调用者想要返回什么。如何在 C# 4.0 中做到这一点?一个让我开始的例子会很棒 - 谢谢。

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

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

谢谢你。

4

3 回答 3

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"));
于 2012-04-13T08:23:04.017 回答
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不将所有文件名加载到内存

于 2012-04-13T08:21:00.213 回答
0

LINQ 中的 Where 方法只能接受两个参数Func<TSource,bool>Func<TSource,int,bool>. 在你的情况下 where filelistis astring[]因此你可以有两个重载的方法

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);
}
于 2012-04-13T08:22:14.330 回答