【问题标题】:How to get the items count from an IList<> got as an object?如何从作为对象获得的 IList<> 中获取项目数?
【发布时间】:2012-01-25 09:29:32
【问题描述】:

在一个方法中,我得到一个object

在某些情况下,这个object 可以是“某事”的IList(我无法控制这个“某事”)。

我正在尝试:

  1. 确定该对象是IList(某物)
  2. object 转换为“IList&lt;something&gt;”,以便能够从中获取Count

目前,我陷入困境并寻找想法。

【问题讨论】:

  • 你想要的是Count all吗?如果是这样,你不需要它是IList&lt;T&gt;,一个简单的IEnumerable 就可以了。
  • 是的,Count 就是我想要的。但是,我在IEnumerable 中看不到任何Count

标签: c# generics reflection casting ilist


【解决方案1】:

您可以使用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&lt;T&gt;IList。但是由于List&lt;T&gt;Collection&lt;T&gt;ILists,这对我来说已经足够了。谢谢。
【解决方案2】:
if (obj is ICollection)
{
    var count = ((ICollection)obj).Count;
}

【讨论】:

  • 感谢您的回答。转换成 ICollection 是否比转换成 IList 有好处?
  • 将适用于更多类型的集合,转换为 IEnumerable 并读取 .Count() 而不是 .Count 将适用于更多类型。
  • @DannyVarod 但IEnumerable.Count() 冒着枚举集合以计算其项目的风险。
  • 取决于集合的实际类型。对于列表,它不会。
  • @phoog,这正是我所怀疑的,但由于根据 DannyVarod 的声明,列表并非如此,因此能够处理 ost 似乎是一个很好的折衷方案的情况。开发人员“只是”需要意识到这一点。
【解决方案3】:
        object o = new int[] { 1, 2, 3 };

        //...

        if (o is IList)
        {
            IList l = o as IList;
            Console.WriteLine(l.Count);
        }

这会打印 3,因为 int[] 是一个 IList。

【讨论】:

    【解决方案4】:

    既然你想要的只是计数,你可以使用任何实现IList&lt;T&gt;的东西也实现IEnumerable的事实;此外,System.Linq.Enumerable 中还有一个扩展方法,它返回任何(通用)序列的计数:

    var ienumerable = inputObject as IEnumerable;
    if (ienumerable != null)
    {
        var count = ienumerable.Cast<object>().Count();
    }
    

    调用Cast 是因为开箱即用的there isn't a Count on non-generic IEnumerable

    【讨论】:

    • 啊,是的,我明白了!但是我是否必须预期此实施会对性能产生影响?
    • @remio 是的,你会的。因为您正在调用Cast&lt;object&gt;,所以您将无法从基础列表的Count 属性中受益,因此您确实会迭代整个列表以计算项目。此外,如果列表的元素是值类型,则必须将它们中的每一个都装箱,因为转换为 object
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2019-10-17
    • 2013-09-07
    • 2020-07-09
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多