检查IEnumerable <object>是否为IEnumerable <int>

时间:2015-05-27 06:46:00

标签: c# linq

IEnumerable<object>类型变量。

IEnumerable<object> items= new object[] { 1, 2, 3 };

检查它是IEnumerable<int>的最佳方式是什么?

我试过

typeof(IEnumerable<int>).IsAssignableFrom(items.GetType())
typeof(IEnumerable<int>).IsInstanceOfType(items)
items is IEnumerable<int>

但是, Re-Sharper 会抱怨所有这些。

就我而言,大多数情况下IEnumerable<object> items的类型为IEnumerable<int> 。我希望在类型为IEnumerable<int>时执行某些操作,而为其他类型执行其他操作。

4 个答案:

答案 0 :(得分:12)

如果您想检查IEnumerable<object>是否仅包含整数,可以使用Enumerable.All

var isInts = items.All(x => x is int);

答案 1 :(得分:6)

因为Valuetypes do not support co or contravarianceIEnumerable<object>不能是IEnumerable<int> - 您自己证明了这一点,因为您必须使用强制转换来生成IEnumerable<object>,这实际上包含了所有int值。因此,R#正确报告了可疑的类型检查,因为它源于您的操作,您的检查将始终返回false。

所以最后你需要在使用强制转换之前单独检查每个元素是否为int,否则你将遇到异常。

答案 2 :(得分:3)

您可以像这样使用CastOfType

应该照顾:

OfType :仅返回x。

类型的元素

投放:会尝试将所有元素投射到x类型中。如果其中一些不是这种类型,您将获得InvalidCastException

items.Cast<int>();

items.OfType<int>();

答案 3 :(得分:1)

您不能将一个泛型转换为另一个,只是因为该类型是另一个的基类。因此,我们无法从document.write("<div id=\"marks\"></div>"); //destination div remoteCounter('marks'); //invoking function 获得Enumerable<int>。 Re-Sharper抱怨因为表达式永远不会返回。

你有

Enumerable<object>

也许您知道您的valueA是用整数填充的,但您也可以在IEnumerable<object> items= ((IEnumerable)valueA).Cast<object>(); 中添加字符串或浮点数。因此,编译器无法确定该列表是否为可枚举的整数。

所以你必须创建一个新的可枚举,就像Peyman之前回答的那样(这不是一个新的列表,只是另一个可枚举的):

items

这将仅返回整数元素,并确保您可以获得items.OfType<int>();