C# 二元表的LINQ三元结果
假设我有一个二进制参数列表(实际上是一个复选框列表,C# 二元表的LINQ三元结果,c#,linq,boolean,iteration,ternary,C#,Linq,Boolean,Iteration,Ternary,假设我有一个二进制参数列表(实际上是一个复选框列表,IsChecked.Valueproperty)。我试图得到bool?(三元)结果: 是true如果列表中的所有元素都是true 是false如果列表中的所有元素都是false 在所有其他情况下均为null,因此列表中既有true又有false元素,或者列表为空 到目前为止,我提出了一个解决方案,需要在列表上迭代两次(检查所有元素是否为true或false),然后比较结果以决定是否返回true、false或null 这是我的代码: bool
IsChecked.Value
property)。我试图得到bool?
(三元)结果:
- 是
如果列表中的所有元素都是true
true
- 是
如果列表中的所有元素都是false
false
- 在所有其他情况下均为
,因此列表中既有null
又有true
元素,或者列表为空false
true
或false
),然后比较结果以决定是否返回true
、false
或null
这是我的代码:
bool checkTrue=myListOfBooleans.All(l=>l);
bool checkFalse=myListOfBooleans.All(l=>!l);
布尔?结果=(!checkTrue&&!checkFalse)?null:(bool?)checkTrue;
如何在列表上只进行一次迭代就可以实现它?您可以简单地计算
真值值:
int c = myListOfBooleans.Count(l => l);
bool? result = c == myListOfBooleans.Count
? (bool?)true
: (c == 0 ? (bool?)false : null);
请注意,对于空列表,这是true
,您可能需要根据所需的逻辑对其进行调整
为了获得更好的性能(尽管我认为这在UI环境中并不重要),您可以编写一个扩展,如果结果明确,甚至可以提前返回(而不是遍历整个列表):
您可以简单地计算true
值:
int c = myListOfBooleans.Count(l => l);
bool? result = c == myListOfBooleans.Count
? (bool?)true
: (c == 0 ? (bool?)false : null);
请注意,对于空列表,这是true
,您可能需要根据所需的逻辑对其进行调整
为了获得更好的性能(尽管我认为这在UI环境中并不重要),您可以编写一个扩展,如果结果明确,甚至可以提前返回(而不是遍历整个列表):
您可以使用Aggegrate
public bool? AllSameValue(List<bool> myListOfBooleans)
{
if(myListOfBooleans.Count == 0) return null; // or whatever value makes sense
return myListOfBooleans.Cast<bool?>().Aggregate((c, a) => c == a ? a : null);
}
您可以使用Aggegrate
public bool? AllSameValue(List<bool> myListOfBooleans)
{
if(myListOfBooleans.Count == 0) return null; // or whatever value makes sense
return myListOfBooleans.Cast<bool?>().Aggregate((c, a) => c == a ? a : null);
}
myListOfBooleans.Cast().Aggregate((c,a)=>c==a?a:null)
注意如果列表为空它将抛出。myListOfBooleans.Cast().Aggregate((c,a)=>c==a?a:null)
注意如果列表为空它将抛出。谢谢。我喜欢这种扩展方法——如果有更多的三元(三态)复选框,其中的状态由“从属”复选框的组合决定,那么这种方法就很方便了。目前我只有一个,所以越简单越好。谢谢。我喜欢这种扩展方法——如果有更多的三元(三态)复选框,其中的状态由“从属”复选框的组合决定,那么这种方法就很方便了。目前我只有其中一个,所以解决方案越简单越好。谢谢,我真的很喜欢这个使用聚合的oneliner。对于第二种解决方案,它更快,因为只有当所有元素都相同时,才需要迭代整个列表。谢谢,我非常喜欢使用聚合的oneliner。对于第二个解决方案,它更快,因为只有当所有元素都相同时,才需要迭代整个列表。
public bool? AllSameValue(List<bool> myListOfBooleans)
{
if(myListOfBooleans.Count == 0) return null; // or whatever value makes sense
bool first = myListOfBooleans[0];
return myListOfBooleans.All(x => x == first ) ? first : null;
}