为什么IEnumerable.Any为False布尔值的集合返回True



我最近需要检查两个列表,看看数据类型是否与预期索引处的预期类型匹配。所以我在每个索引I的每个元素x上做了一个检查,并将这个比较存储为布尔值,然后我调用Any来查看是否有布尔值为true。但是,下面的语句总是抛出异常。

var values = new object[] {(UInt64) 40, (Boolean) true, (Double) 45.3};
var types = new[] {typeof (UInt64), typeof (Boolean), typeof (Double)};
if (types.Select((x, i) => values[i].GetType() != x).Any())
    throw new Exception();

(我知道为什么,但花了几分钟调试后,我认为这将是一个很好的问题)。

不带参数的Enumerable.Any只检查序列是否包含元素。如果你想知道是否有true,你必须使用过载:
bool anyTrue = bools.Any(b => b);

Any不会检查序列中的内容。如果序列中有任何元素,它将查找。因此,是否有一系列真值或假值并不重要。

Any()不会做你认为它会做的事情。如果Any()中没有lambda表达式,它只会检查调用它的可枚举对象中是否有任何元素。

你要么想要:

types.Select((x, i) => values[i].GetType() != x).Any(x => x)

或者

types.Where((x, i) => values[i].GetType() != x).Any()

您需要使用Any()方法的这个重载。如果序列包含的东西,那么您使用的重载只会返回true,而不在乎值是什么。要检查布尔值并仅在其中一个为真时返回,您的代码需要是

if (types.Select((x, i) => values[i].GetType() != x).Any(x => x))
    throw new Exception();

最新更新