繁体   English   中英

动态构建lambda表达式

[英]Dynamic build lambda expressions

所以,我开始构建一个小测试应用程序来测试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;
}

“这当然不起作用”

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

要根据指定运算符的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();

如果用户输入无法转换的内容,则将age字符串转换为int将抛出。 查找TryParse以避免异常。

http://www.albahari.com/nutshell/predicatebuilder.aspx上试用Predicate Builder

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

您可以使用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

您的示例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表达式对象实现这是一个更复杂的功能。

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

这是我用于Form1.cs文件的代码,它按预期工作:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        List<People> lPeople = new List<People> 
        {
            new People { Name= "Jean", LastName = "Borrow", Age= 21 } ,
            new People { Name= "Dean", LastName = "Torrow", Age= 20 }
        };

        IEnumerable<People> result = lPeople.Where(p => p.Name == textBox1.Text);

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

public class People
{
    public string Name { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

在动态用户选择的情况下,我认为更优雅的解决方案而不是使用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);        

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM