\begingroup
有没有更清晰的方法来识别bool
a 中的 sList<bool>
是全部为真、全部为假还是混合为真?
我通过拥有一个可空值bool?
然后执行以下操作来完成此操作:
bool? result;
if (ls.TrueForAll(x => x == true))
{
result = true;
}
else if (ls.TrueForAll(x => x == false))
{
result = false;
}
else
{
result = null;
}
然而,这需要迭代列表两次,并且感觉像是一种稍微冗长的方法,并且感觉像是一个可能已经解决的问题。
我不太担心性能,因为在我的代码中这种情况并不经常发生,所以我更感兴趣的是采用一种更简洁的方式来实现这一点。
这是一个带有设置/演示的 dotnetfiddle:
\endgroup
4
最佳答案
2
\begingroup
您需要做的就是:
- 获取第一个布尔数组组件b1b1b_1,
- 迭代数组其余部分b2,… ,bnb2,…,bnb_2, \ldots, b_n,
- 如果 (2) 中的某个数组分量不匹配b1b1b_1, 返回
null
, - 否则,返回b1b1b_1
我想到了这个假设的代码:
static bool? GetListBool(bool[] boolArray)
{
const bool selector = boolArray[0];
for (int i = 1; i < boolArray.Length; i++)
{
if (boolArray[i] != selector)
{
return null;
}
}
return selector;
}
\endgroup
5
-
\begingroup
是的,就是这样。早该想到这一点的!
\endgroup
– -
2\begingroup
当你传递一个空数组时会发生什么?
\endgroup
– -
1\begingroup
@Bergi 数组索引越界异常,我知道。两个选项:(1) 返回null
,或者不捕获并重新抛出。
\endgroup
– -
\begingroup
const bool selector = boolArray[0];
给出“常量初始化程序必须是编译时常量”错误。删除const
。
\endgroup
– -
\begingroup
@PiersMyers 我在回答中提到我的代码是假设的。我实际上不做 C#。
\endgroup
–
|
\begingroup
它可能就这么简单(正如 Joop Eggen 所建议的那样):
return list.All(x => x == list[0]) ? list[0] : null;
更新 #1
上述代码没有处理集合为空的情况。由于问题中没有提到针对这种情况的任何具体要求,因此如何处理取决于 OP。
将其视为null
return list.Any() && list.All(x => x == list[0]) ? list[0] : null;
将其视为false
return list.Any()
? list.All(x => x == list[0]) ? list[0] : null
: false;
将其视为true
return list.Any()
? list.All(x => x == list[0]) ? list[0] : null
: true;
引发自定义异常
return list.Any()
? list.All(x => x == list[0]) ? list[0] : null
: throw new CustomException();
\endgroup
9
-
\begingroup
很好,按照原始问题的方式处理空列表。
\endgroup
– -
1\begingroup
@JoopEggen YeppAll
是安全的。list[0]
不是。
\endgroup
–
-
1\begingroup
这也是一个很好的解决方案,谢谢。
\endgroup
– -
1\begingroup
@JollyJoker 由于问题没有指定如何处理空集合的任何要求,我认为由 OP 决定如何实现该部分。
\endgroup
– -
1\begingroup
@PeterCsala 我想这意味着没有这个的原始版本list.Any()
会更好
\endgroup
–
|
弹出第一个(如果可能的话!)并且剩余的列表必须全部是第一个元素。
\endgroup
–
当所有值都是
true
且所有值都是时,您想返回什么false
– 例如对于空列表?\endgroup
–
该列表实际上并未迭代两次,因为 TrueForAll 方法的“当委托对任何元素返回 false 时,处理就会停止”。因此在其中一个分支中,处理在第一个元素之后停止。
\endgroup
–
..
\endgroup
–
|