如何动态创建谓词

您好我想使用谓词表达式基于搜索字符串创建列表。

我有一个类型产品列表包含不同的名称。

List list1 = new List(); list1.Add(new products("sowmya")); list1.Add(new products("Jane")); list1.Add(new products("John")); list1.Add(new products("kumar")); list1.Add(new products("ramya")); listBox1.ItemsSource = list1; 

现在我想根据用户输入过滤内容。用户将输入n个字符串,并带有’+’作为分隔符。 收到字符串后,我会将它们传递给谓词对象

  private void textBox1_KeyDown(object sender, KeyEventArgs e) { List list2 = new List(); Expression<Func> predicate = PredicateBuilder.True(); if (e.Key == Key.Enter) { string Searchstring = textBox1.Text.ToString().Trim(); string[] separator = new string[] { "+" }; string[] SearchItems=Searchstring.Split(separator,StringSplitOptions.None); foreach (string str in SearchItems) { string temp = str; predicate =p => p.Name.Contains(temp.ToLower()); } list2 = list1.AsQueryable().Where(predicate).ToList(); listBox1.ItemsSource = list2; } } 

如果我输入多个字符串(sowmya + jane + john),它只给出最后一个字符串(john)结果,但我想要一个所有匹配字符串的列表

请回答这个问题,因为我正在尝试这个,但我无法得到结果。

请帮忙谢谢。

将谓词初始化为false

 Expression> predicate = PredicateBuilder.False(); 

您需要使用Or组合谓词

 foreach (string str in SearchItems) { string temp = str; predicate = predicate.Or(p => p.NameToLower().Contains(temp.ToLower())); } 

这里谓词构建器的来源。 它是LINQKit的一部分

代码,以防链接进行

 using System; using System.Linq; using System.Linq.Expressions; using System.Collections.Generic; public static class PredicateBuilder { public static Expression> True () { return f => true; } public static Expression> False () { return f => false; } public static Expression> Or (this Expression> expr1, Expression> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ()); return Expression.Lambda> (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters); } public static Expression> And (this Expression> expr1, Expression> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ()); return Expression.Lambda> (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); } } 

您不必在此处构建谓词。 你可以尝试这样的事情

 List list1 = new List(); list1.Add(new products("sowmya")); list1.Add(new products("Jane")); list1.Add(new products("John")); list1.Add(new products("kumar")); list1.Add(new products("ramya")); string input = "aaa+kuma+ram"; List searchStrings = input.Split(new string[] { "+" }, StringSplitOptions.None) .Select(s => s.ToLower()) .ToList(); List list2 = ( from p in list1 where searchStrings.Any(s => p.Name.Contains(s)) select p).ToList(); 

list2将包含“kumar”和“ramya”。

由于我不确定谓词实例是否有And方法,我建议您使用以下代码:

 var list = list1.AsQueryable(); foreach (string str in SearchItems) { list = list.Where(p => p.Name.ToLower().Contains(str.ToLower())); } listBox1.ItemsSource = list.ToList();