2009-05-24 104 views
4

于是,我开始建立一个小的测试应用程序来测试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; 
} 
+0

我想你可能错误地键入了文本框控件的名称。它是TextBox1吗? :) – shahkalpesh 2009-05-24 18:06:10

回答

5

的解决方案“这当然是不行的”

会发生什么事,当你尝试了吗?从它的外观来看,这就是我一直在做的事情。

要根据组合框指定的经营者进行切换操作:

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以避免例外。

+0

Omg,我很抱歉!它确实工作:)但操作员呢? – 2009-05-24 18:07:57

+0

好的......你的意思是你想根据对话框控件的状态选择运算符(==,<, >,!=等)? (如果你真的很仔细地解释你想要达到的目标,这会更快!) – 2009-05-24 18:32:43

+0

嗨Earwicker,是的,我希望那样。我有一个用户界面,用户可以选择按姓氏筛选人员列表,即按年龄筛选。我有一个ListBox,可以在其中选择>,=和<以及一个可输入年龄的文本框。 – 2009-05-24 18:55:11

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 Expression对象实现的更复杂的功能。

2

应该有什么不对,你要去了解它的方式。我创建了一个简单的Windows窗体应用程序,其中包含TextBoxButtonDataGridView(分别命名为textBox1,button1dgv_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; } 
} 
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);