C# 链接Linq Where子句

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

如何根据不同的变量状态在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.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));