为什么IEnumerable.Any为False-booleans集合返回True?

时间:2014-10-02 09:32:19

标签: c# .net linq

我最近需要检查两个列表,以查看预期索引处的数据类型是否与预期类型匹配。所以我对每个索引i处的每个元素x进行了检查,并将此比较存储为布尔值,然后我调用Any来查看是否有任何布尔值为真。但是,以下语句始终抛出异常。

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();

(我知道为什么,但经过几分钟的调试后,我认为这会成为一个好问题)。

4 个答案:

答案 0 :(得分:8)

不带参数的

Enumerable.Any只检查序列是否包含元素。如果您想知道是否有任何true s,您必须使用overload

bool anyTrue = bools.Any(b => b);

答案 1 :(得分:7)

Any不检查序列中的内容。它会查找如果序列中有 Any 元素。那么你是否有一系列真值为false并不重要。

答案 2 :(得分:5)

Any()并不能按照您的想法行事。如果Any()中没有lambda表达式,它只会检查调用它的枚举中是否有任何元素。

你要么:

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

或者

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

答案 3 :(得分:3)

您需要使用Any()方法的this overload。如果序列包含 stuff ,那么您使用的重载只返回true,它并不关心值是什么。要检查布尔值并且仅在它们为真时返回,您的代码将需要

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