如何根据不同的变量状态链接linq中的“Where”子句。 E,g;年龄范围(21-30,31-40,41-50,51-60,60>)的复选框
我们有List<People>
'人',我们需要根据复选框过滤它。假设List不能只是一个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
有更好的解决方法吗?
答案 0 :(得分:6)
我会将这些全部捆绑到一个Where
语句中并更新inTheirTwenties
方法,以便像这样接受个人:
filteredPeople.Where(x => (CB1.checked && inTheirTwenties(x))
|| (CB2.checked && inTheirThirties(x)) ...);
答案 1 :(得分:2)
链接使用.Where()
的未知数量的OR
子句会导致详细且难以阅读的代码。幸运的是,在您的场景中,您可以将其反转为一系列AND
表达式,这些表达式提供了更易读的代码批。
var filteredPeople = new List<Person>();
if(!checkBox1) filteredPeople = filteredPeople.Where(p => !inTheirTwenties(p));
if(!checkBox2) filteredPeople = filteredPeople.Where(p => !inTheirThirties(p));
如果这是一个LINQ-to-SQL查询,这种类型的代码还可以通过创建一个优雅的WHERE子句来简化数据库的内容,而不会在true
和false
之间发送线。当然,您将无法使用inTheirTwenties(Person)
访问SQL Server,而是会执行以下操作:
filteredPeople.Where(p => !(p.Age >= 21 && p.Age <=30));