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);