[英]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的以下博客文章:
您的示例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窗体应用程序,其中包含TextBox
, Button
和DataGridView
(分别名称为textBox1
, button1
和dgv_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.