所以,我开始构建一个小测试应用程序来测试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 :(得分: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的以下博客文章:
答案 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窗体应用程序,其中包含TextBox
,Button
和DataGridView
(名称为textBox1
,button1
和{{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);