【问题标题】:Conversion of IEnumerable<T> to IList将 IEnumerable<T> 转换为 IList
【发布时间】:2010-01-04 16:07:10
【问题描述】:

如果方法采用 System.Collections.IList 类型的参数,我可以合法/安全地传递 System.Collections.Generic.IEnumerable&lt;T&gt; 类型的值吗?

如果在方法内部使用IEnumerable&lt;T&gt; 时,我希望能详细解释为什么这是可能的以及对象T 实际发生的情况。

它是否转换为 Object 的基本类型?

是否用作System.Collections.IEnumerable?

在任何情况下这会导致问题(即性能问题)吗?

提前致谢, 约翰

【问题讨论】:

    标签: .net generics ienumerable ilist


    【解决方案1】:

    否,您不能将IEnumerable&lt;T&gt; 传递给采用IList 的方法。接口IEnumerable&lt;T&gt; 不能转换为IList,并且尝试将IEnumerable&lt;T&gt; 类型的变量传递给采用IList 的方法将导致编译错误。

    为了完成这项工作,您需要执行以下操作之一

    1. 保持对实现IEnumerable&lt;T&gt; 和IList 的类型的引用,而不是IEnumerable&lt;T&gt;。 List&lt;T&gt; 是个不错的候选人
    2. 将IEnumerable&lt;T&gt; 实例转换为可转换为IList 的新对象。例如,在 3.5+ 中,您可以调用 .ToList() 扩展方法在枚举上创建一个新的 List&lt;T&gt;。

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        没有。如果不使用 ToList() 扩展方法,您就不能这样做。我认为这不应该导致 大的性能问题 - 如果您有替代方案,请对它们进行计时并进行比较。

        您也可以使用new List&lt;T&gt;(myIEnumerable) - 文档说该函数是O(n) 操作,但我找不到关于ToList() 的任何其他信息。另外,请记住List&lt;T&gt; 也实现了IList 和IList&lt;T&gt;。

        【讨论】:

          【解决方案4】:

          IEnumerable 不允许对集合进行索引访问,而 IList 允许。因此, IList 不仅仅是 IEnumerable ,您将无法摆脱它。当然,有些类同时实现了这两个接口(例如 List),它们可以正常工作。

          如果您需要从 IEnumerable 转到 IList,您可以先尝试强制转换,如果幸运的话,它会起作用。如果没有,您将不得不遍历 IEnumerable 集合并构建一个新的 IList。

          编辑:使用 ToList() 而不是像其他人建议的那样自我探索。

          【讨论】:

            【解决方案5】:

            不,您不能将 IEnumerable 传递给它。 IList 实现了 IEnumerable,因此如果将方法传递给 IList,则可以安全地将其用作 IEnumerable。 VS 不会编译以下内容:

            private static void Test(IList<int> list){ }
            
            Test(Enumerable.Range(0, 10));
            

            返回错误:

            Argument '1': cannot convert from System.Collections.Generic.IEnumerable<int>' to 'System.Collections.Generic.IList<int>'
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-24
              • 1970-01-01
              • 2021-12-02
              • 2018-08-04
              相关资源
              最近更新 更多