在一个方法中,我获取了一个对象
。
在某些情况下,这个对象
可能是一个“something”的IList
(我无法控制这个“something”)。
我正在尝试:
- 确定这个对象是一个
IList
(of something) - 将
对象
转换为一个“IList<something>
”,以便能够从中获取Count
。
目前,我被卡住了,正在寻找思路。
在一个方法中,我获取了一个对象
。
在某些情况下,这个对象
可能是一个“something”的IList
(我无法控制这个“something”)。
我正在尝试:
IList
(of something)对象
转换为一个“IList<something>
”,以便能够从中获取Count
。目前,我被卡住了,正在寻找思路。
is
来检查你的object
是否实现了IList
接口。object
强制转换成IList
以获得计数。object myObject = new List<string>();
// check if myObject implements IList
if (myObject is IList)
{
int listCount = ((IList)myObject).Count;
}
IList<T>
是一个 IList
。但是由于 List<T>
和 Collection<T>
都是 IList
,所以这已经足够了。谢谢。 - remioif (obj is ICollection)
{
var count = ((ICollection)obj).Count;
}
IEnumerable.Count()
的风险在于需要枚举集合以计算其项数。 - phoogIEnumerable
方法对于你的用例不起作用。Count()
扩展方法是针对IEnumerable<T>
而不是IEnumerable
的,因此在调用Count()
之前,你仍然需要确定集合成员的类型。 - phoogCast<object>
,则不再直接计算列表成员数量;而是从转换迭代器中获取它们,该迭代器无法访问包装对象的Count
属性。 - phoog object o = new int[] { 1, 2, 3 };
//...
if (o is IList)
{
IList l = o as IList;
Console.WriteLine(l.Count);
}
这会打印出3,因为int[]是一个IList。
既然你只需要计数,那么你可以利用实现了 IList<T>
接口的任何对象也都实现了 IEnumerable
接口这一事实;而且在 System.Linq.Enumerable
中还有一个扩展方法,可以返回任何(泛型)序列的计数:
var ienumerable = inputObject as IEnumerable;
if (ienumerable != null)
{
var count = ienumerable.Cast<object>().Count();
}
调用 Cast
是因为默认情况下 非泛型的 IEnumerable
上没有 Count
方法。
Cast<object>
,所以你将无法从基础列表的Count
属性中获益,因此你确实需要遍历整个列表以计算项目数。此外,如果列表的元素是值类型,由于转换为object
,你将不得不对它们进行装箱。 - phoog
Count
吗?如果是这样,你不需要它成为一个IList<T>
,一个简单的IEnumerable
就可以了。 - AakashMCount
就是我想要的。但是我在IEnumerable
中找不到任何Count
? - remio