我最近需要检查两个列表,以查看预期索引处的数据类型是否与预期类型匹配。所以我对每个索引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();
(我知道为什么,但经过几分钟的调试后,我认为这会成为一个好问题)。
答案 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();