嗨,我试图过滤一个基于多个bool参数的项目列表。我有3个bool参数(它们是UI中的3个复选框):IsTypeA、IsTypeB、IsTypeC。基于这3个值,我必须在条目的枚举属性(简单称为"Type")上筛选我的列表。可以选中多个复选框。在类型过滤器之上还有另一个过滤器("in","out"),但这是有效的。到目前为止,我尝试的是:
FilteredDashboardItems = AllItems?.Where(x =>
Destination == "in" ?
(
(IsTypeA == true ? x.Type == Helpers.Enum.A : true)
&&
(IsTypeB == true ? x.Type == Helpers.Enum.B : true)
&&
(IsTypeC == true ? x.Type == Helpers.Enum.C : true)
) :
Destination == "out" ?
(
(IsTypeA == true ? x.Type == Helpers.Enum.A : true)
&&
(IsTypeB == true ? x.Type == Helpers.Enum.B : true)
&&
(IsTypeC == true ? x.Type == Helpers.Enum.C : true)
) : true)?.ToList();问题是:如果我奇异地选中一个复选框(假设是IsTypeA),该列表将被正确筛选为A类型项。但是,如果我选中另一个复选框(假设是IsTypeB),而不是向我显示A+B类型筛选列表,列表将返回0项。我该怎么解决呢?
发布于 2022-09-14 11:38:29
你需要这样的东西:
List<int> typesToCheck = new List<int>();
if (IsTypeA) typesToCheck.Add((int)Helpers.A);
if (IsTypeB) typesToCheck.Add((int)Helpers.B);
if (IsTypeC) typesToCheck.Add((int)Helpers.C);
FilteredDashboardItems = AllItems?.Where(x => Destination == "in" ?
(IsTypeA || IsTypeB || IsTypeC ? typesToCheck.Contains(x.Type) : true)
:
Destination == "out" ?
(IsTypeA || IsTypeB || IsTypeC ? typesToCheck.Contains(x.Type) : true)
:
true)?.ToList();一旦你把它写进这个表格,我相信你也可以简化目标条件
发布于 2022-09-14 11:12:06
您正在使用&&,这将给您两个过滤器的交集,从而获得0条记录。
您需要使用OR \x\\以便它显示满足任何一个筛选器的元素。
发布于 2022-09-14 11:25:30
你的情况有点奇怪
IsTypeA == true ? x.Type == Helpers.Enum.A : true如果IsTypeA不是可空bool,那么就不需要将其与true进行比较,因为从逻辑上来说,您可以得到true == true或false == trueE 210,所以您可以只留下E 111IsTypeAE 212。
我会重写你的条件:
FilteredDashboardItems = AllItems?.Where(x =>
Destination == "in" ?
(
(IsTypeA && x.Type == Helpers.Enum.A)
||
(IsTypeB && x.Type == Helpers.Enum.B)
||
(IsTypeC && x.Type == Helpers.Enum.C)
) :
Destination == "out" ?
(
(IsTypeA && x.Type == Helpers.Enum.A)
||
(IsTypeB && x.Type == Helpers.Enum.B)
||
(IsTypeC && x.Type == Helpers.Enum.C)
) : true)?.ToList();现在我们有了简单的逻辑:如果所选类型中至少on等于对象类型,则保留此对象。
https://stackoverflow.com/questions/73715715
复制相似问题