动态构建lambda表达式

时间:2009-05-24 17:46:49

标签: c# lambda

所以,我开始构建一个小测试应用程序来测试lambda表达式。我在这里和其他地方找到了几个例子但是我没有得到它们。

有人可以解释我如何使用文本框或任何其他变量构建表达式吗?

我的测试清单

List<People> lPeople = new List<People> 
{
    new People { Name= "Jean", LastName = "Borrow", Age= 21 } ,
    new People { Name= "Dean", LastName = "Torrow", Age= 20 }
};

工作lambda表达式

IEnumerable<People> result = lPeople.Where(p => p.Age < 21);
dgv_1.DataSource = result.ToList();
dgv_1.Update();

如何动态构建表达式?

lPeople.Where(p => p.LastName == Textbox.Text);这样的东西(当然不起作用)

谢谢!

编辑:在下面的解决方案中添加了一些代码

Int32 iAge;
Boolean bSuc = Int32.TryParse(tb_filter_age.Text, out iAge);
if (!bSuc)
{
    iAge = 0;
}

6 个答案:

答案 0 :(得分:5)

“哪个当然不起作用”

尝试时会发生什么?从表面上看,这就是我一直在做的事情。

根据指定运算符的ComboBox切换操作:

int age = int.Parse(textBoxAge.Text);

IEnumerable<People> result;
if (comboBoxOperator.Text == "=")
    result = lPeople.Where(p => p.Age == age);
else if (comboBoxOperator.Text == "<")
    result = lPeople.Where(p => p.Age < age);
else
    result = lPeople.Where(p => p.Age > age);

dgv_1.DataSource = result.ToList();
dgv_1.Update();

如果用户输入无法转换的内容,则将年龄字符串转换为int的代码将抛出。查找TryParse以避免例外。

答案 1 :(得分:5)

http://www.albahari.com/nutshell/predicatebuilder.aspx

尝试Predicate Builder

我用它来进行高级搜索,用户可以继续添加可选的搜索条件。

答案 2 :(得分:2)

您可以使用Linq Dynamic Query Library来完成此任务。有关更多信息,请参阅Scott Guthrie的以下博客文章:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

答案 3 :(得分:2)

您的示例lambda表达式将起作用。你需要它有多动态?如果要将“过滤器”的静态UI应用于集合,则可以创建类似于以下内容的代码:

IEnumerable<People> result = lPeople;
if (txtLastName.Text.Trim().Length != 0) 
    result = result.Where(p => p.LastName == txtLastName.Text); 
if (chkSeniors.Checked) 
    result = result.Where(p => p.Age >= 65);
dgv_1.DataSource = result.ToList();
dgv_1.Update();

如果您希望数据源的使用者应用真正的动态表达式(使他们能够选择要过滤的其他字段和要使用的表达式),那么使用谓词构建器工具或LINQ表达式实现这是一个更复杂的功能对象。

答案 4 :(得分:2)

你的方式应该没有错。我创建了一个简单的Windows窗体应用程序,其中包含TextBoxButtonDataGridView(名称为textBox1button1和{{1}分别。)

以下是我用于dgv_1文件的代码,该代码按预期工作:

Form1.cs

答案 5 :(得分:1)

在动态用户选择的情况下,我认为更优雅的解决方案,而不是使用if块来声明变量

Func<People, bool> expFilter;

根据用户选择设置其值

switch(comboBoxOperator.Text)
{
   case "=":
   expFilter = p => p.Age == age;
   break;

   case ">":
   expFilter = p => p.Age > age;
   break;

   case "<":
   expFilter = p => p.Age < age;
   break;
}    

然后将其传递给Where子句:

result = lPeople.Where(expFilter);