C# 链接Linq Where子句
如何根据不同的变量状态在linq中链接“Where”子句。 E、 g;年龄范围的复选框(21-30、31-40、41-50、51-60、60>) 我们有一个C# 链接Linq Where子句,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,如何根据不同的变量状态在linq中链接“Where”子句。 E、 g;年龄范围的复选框(21-30、31-40、41-50、51-60、60>) 我们有一个列表“人员”,我们需要根据复选框对其进行筛选。假设列表不能只是一个已计算的IEnumerable 除此之外: List<People> filteredPeople = new List<people>(); if(CB1.checked) filteredPeople = filteredPeople.Uni
列表
“人员”,我们需要根据复选框对其进行筛选。假设列表不能只是一个已计算的IEnumerable
除此之外:
List<People> filteredPeople = new List<people>();
if(CB1.checked)
filteredPeople = filteredPeople.Union(People.Where(inTheirTwenties)) //assuming method inTheir20s filters correct
if(CB2.checked)
filteredPeople = filteredPeople.Union(People.Where(inTheirThirties)) ;
//...and so on
List filteredPeople=new List();
如果(CB1.选中)
filteredPeople=filteredPeople.Union(People.Where(在二十年代))//假设二十年代过滤器中的方法正确
如果(CB2.选中)
filteredPeople=filteredPeople.Union(三十岁时的People.Where));
//……等等
有没有更好的方法解决这个问题?我会把这一切打包成一个
Where
语句,并在二十年代更新方法,以这样对待个人:
filteredPeople.Where(x => (CB1.checked && inTheirTwenties(x))
|| (CB2.checked && inTheirThirties(x)) ...);
链接使用或
的数量未知的.Where()
子句可能会导致代码冗长且难以阅读。幸运的是,在您的场景中,您可以将其转换为一系列的和表达式,这些表达式提供了一批可读性更高的代码
var filteredPeople = new List<Person>();
if(!checkBox1) filteredPeople = filteredPeople.Where(p => !inTheirTwenties(p));
if(!checkBox2) filteredPeople = filteredPeople.Where(p => !inTheirThirties(p));
为什么联合
?您可以直接应用Where
方法filteredPeople=filteredPeople.Where(p=>p.Age>=21&&p.Age一个列表实现了一个IEnumerable
,事实上有很多视图集合没有。所以它可以,也就是它是否被评估过。您是否在考虑IQueryable
这个代码刚刚被破坏。检查CB1和CB2不会同时返回20和30秒。因为您正在更改filteredPeo调用之间的ple
。事实上,您的代码当前将返回所有人
。如果我们可以选中多个复选框,这将不起作用?@tichra应该这样做,因为我们一次只评估一个对象,通过将x传递到InIntertwentes方法中,我们将不同的检查与|
sthanks和i组合在一起如果未选中任何内容,我假设它将返回空而不是全部?@tichra这是正确的,您可以添加对| |(!CB1.checked&&!CB2.checked…)
的检查,如果您想在未选中任何内容的情况下返回所有内容。根据您的看法,除了在前一行中编写单独的if语句外,返回所有内容的最佳方法是什么?
filteredPeople.Where(p => !(p.Age >= 21 && p.Age <=30));