C# 如何很好地从IEnumerable转换<;T>;到列表<;T>;?

C# 如何很好地从IEnumerable转换<;T>;到列表<;T>;?,c#,.net,C#,.net,我有一个IEnumerable,我想把它转换成列表。 最好的方法是什么?(无需迭代IEnumerable)确保可以对IEnumerable调用ToList()方法始终必须迭代IEnumerable才能生成列表。是的,通过使用IEnumerable.ToList()扩展方法可以避免编写代码。仍然是O(n) 使用 当然,这会遍历背景中的所有元素,但如果没有,这是不可能的,原因有两个: List不是另一个列表的包装器,而是动态大小数组的实现 List提供了IEnumerable没有的方法和属性(如Co

我有一个
IEnumerable
,我想把它转换成
列表

最好的方法是什么?(无需迭代IEnumerable)

确保可以对IEnumerable调用ToList()方法

始终必须迭代IEnumerable才能生成列表。是的,通过使用IEnumerable.ToList()扩展方法可以避免编写代码。仍然是O(n)

使用

当然,这会遍历背景中的所有元素,但如果没有,这是不可能的,原因有两个:

  • List
    不是另一个列表的包装器,而是动态大小数组的实现
  • List
    提供了
    IEnumerable
    没有的方法和属性(如
    Count
    ),如果不遍历所有元素,就无法确定这些方法和属性
  • 您可以使用
    IEnumerable
    上的扩展方法,或

    IEnumerable number=。。。;
    List numberList=numbers.ToList();
    列表编号List2=新列表(编号);
    
    不管怎样,正如其他人所说,您必须枚举原始的
    可枚举的
    ,(无论您是否手动执行),如果原始的
    IEnumerable
    列表
    ICollection
    ,则这些方法中的一种或两种可能比原始枚举更有效


    另外,如果您有一个非泛型的
    IEnumerable
    ,则需要先将其转换为
    IEnumerable
    ,然后才能使用这两种方法中的任何一种,使用
    IEnumerable

    上的扩展方法,无论从哪种角度看,您都必须枚举和可枚举才能获得项是否始终创建新列表?返回现有列表可能会引起意外。@Jon:事实上,它仍然是迭代的,仍然是O(n)。@Stephen:如果你投下它,就不会了。我对第一句话做出了回应:如果已经是
    列表
    的话,你可以通过铸造
    IEnumerable
    来“生成”一个
    列表。我不是说这是个好主意,但值得一提的是:)(不过,
    ReadOnlyList
    的等价物是个好主意。)我认为
    ToList()
    执行了一个
    CopyTo
    ,如果目标可枚举对象是
    ICollection
    ,如果是其他对象,则进行枚举?因此,如果枚举对象是
    IList
    ,那么
    ToList
    是否也会执行底层数组的
    CopyTo
    new List(enumerable);
    
    IEnumerable<int> numbers = ...;
    List<int> numberList = numbers.ToList();
    List<int> numberList2 = new List<int>(numbers);