【问题标题】:How do I convert a non-Generic IList to IList<T>?如何将非通用 IList 转换为 IList<T>?
【发布时间】:2019-10-21 22:18:30
【问题描述】:

我的班级需要 IList&lt;T&gt;,但我有一个来自 NHibernate quere 的 Systems.Collection.IList

我想创建一个将其转换为IList&lt;T&gt; 的方法。我该怎么做?

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果您确定所有元素都继承自 T(或您使用的任何类型)

    IList<T> myList = nonGenericList.Cast<T>().ToList();
    

    如果您不确定:

    IList<T> myList = nonGenericList.OfType<T>().ToList();
    

    当然,您需要 System.Linq 命名空间:

    using System.Linq;
    

    【讨论】:

      【解决方案2】:

      CastOfType 返回 IEnumerable&lt;T&gt; 实现,而不是 IList&lt;T&gt; 实现,因此它们对您没有用处。

      调用 .Cast&lt;T&gt;().ToList 会产生一个额外的列表副本,这可能会对性能产生不利影响。

      更好的(恕我直言)方法是创建一个包装类并即时进行转换。你想要这样的东西:

      class ListWrapper<T> : IList<T>
      {
          private IList m_wrapped;
      
          //implement all the IList<T> methods ontop of m_wrapped, doing casts
          //or throwing not supported exceptions where appropriate.
          //You can implement 'GetEnumerator()' using iterators. See the docs for 
          //yield return for details
      }
      

      这样做的好处是不会创建整个列表的另一个副本。

      【讨论】:

        【解决方案3】:

        弗雷德里克是正确的。但是 Nhibernate 也可以选择返回多个结果集。 例如:

          IList multiResults = session.CreateMultiCriteria()
                        .Add(pageCriteria)
                        .Add(countCriteria)
                        .List();
        

        在上述调用中,没有返回类型列表的选项。所以它必须像上面提到的那样铸造,像这样:

         IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
                    IList counts = (IList)multiResults[1];
        

        【讨论】:

          【解决方案4】:

          一种方法是使用 Linq,例如 list.OfType&lt;T&gt;().Cast&lt;T&gt;()

          【讨论】:

            【解决方案5】:

            你不能实现 NHibernate 返回一个 IList 吗? ICriteria 接口定义了一个List&lt;T&gt; 方法...

            【讨论】:

            • 是的,你可以!只需使用 var result = Session.CreateCriteria(....).List() 代替 og .List().
            • @stiank81:这是一个反问的问题。 ;)
            • 嗯 - 我明白了 ;-) 刚刚从你那里学到了这一点,我很高兴地 +1 一起添加评论和细节......
            • CreateMultiCriteria.List() 没有 List。我看到了。
            【解决方案6】:

            Frederik 是正确的,NHibernate 已经这样做了。

            var data = query.List<MyType>();
            

            这将产生您指定类型的 IList。在这种情况下IList&lt;MyType&gt;

            【讨论】:

              【解决方案7】:

              在这种情况下不需要使用 Linq(OfType() 或 .Cast)。 NHibernate 实现就足够了。

              你只需要使用:

              var results= query.List<YourType>();
              

              而不是

              var results= query.List<>();
              

              【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多