2011-09-27 77 views
2

Here是描述动态创建谓词的方式的帖子。这里是一个片段:使用表达式类构建LINQ表达式时使用正则表达式进行搜索

var param = Expression.Parameter(typeof(string), "p"); 
    var len = Expression.PropertyOrField(param, "SomeText"); 
    var body = Expression.Equal(
     len, Expression.Constant("Text")); 

    var lambda = Expression.Lambda<Func<string, bool>>(
     body, param); 

我想知道如何将正则表达式应用于字符串而不是平等。有没有可能? 一个可能的伪代码将是这样的:

var param = Expression.Parameter(typeof(string), "p"); 
    var len = Expression.PropertyOrField(param, "SomeText"); 
    var body = Expression.Regexp(
     len, @"\D+"); 

    var lambda = Expression.Lambda<Func<string, bool>>(
     body, param); 

回答

1

您可以使用Expression.Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments)调用该检查正则表达式的测试方法。

List<string> lista = new List<string>() { "aaaa", "aaabb", "aaacccc", "eee" }; 

     var param = Expression.Parameter(typeof(string), "s"); 
     var pattern = Expression.Constant("\\Aa"); 

     var test = Expression.Call(typeof(Regex), "IsMatch", null, param, pattern); 

     var lambda = Expression.Lambda<Func<string, bool>>(test, param); 

     IEnumerable<string> query = lista.Where(lambda.Compile()); 

     foreach (string s in query) 
     { 
      Console.WriteLine(s); 
     } 
+0

谢谢,你有任何代码示例? –

+0

看到我编辑的答案 –

+0

这个字符串来自哪里 - “IsMatch”? –