为什么IEnumerable.Any为False布尔值的集合返回True
本文关键字:集合 返回 True 布尔值 False IEnumerable Any 为什么 | 更新日期: 2023-09-27 18:25:28
我最近需要检查两个列表,看看数据类型是否与预期索引处的预期类型匹配。所以我在每个索引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();