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;
}