C# 在IEnumerable上使用ToList()方法<;T>;这已经是一个列表<;T>;
对已经是列表的IEnumerable使用ToList()方法:C# 在IEnumerable上使用ToList()方法<;T>;这已经是一个列表<;T>;,c#,.net,linq,C#,.net,Linq,对已经是列表的IEnumerable使用ToList()方法: 它会创建一个新的列表吗 在性能方面:其复杂性仍然是O(n)或更低 它将创建一个新列表 它将使用Array.CopyTo在内部复制元素,这是(从)O(n) 您可以看到列表(这就是所谓的)构造函数的代码它很简单,但需要一些说明 对。它将创建新的列表实例 现在,当要创建新列表时。它将复制其中的所有项目。如果是valuetype,则复制实际值;如果是reference type,则复制该ref。 它是O(n) 类程序 { 静态异步任务主(
Array.CopyTo
在内部复制元素,这是(从)O(n)您可以看到
列表
(这就是所谓的)构造函数的代码它很简单,但需要一些说明
类程序
{
静态异步任务主(字符串[]args)
{
//值类型
List valueTypeitems=新列表();
valueTypeitems。添加(1);
valueTypeitems。添加(2);
var newlist=valueTypeitems.ToList();
valueTypeitems[0]=3;//这将只反映在第一个列表中。
valueTypeitems.ForEach(cc=>Console.WriteLine(cc));
ForEach(cc=>Console.WriteLine(cc));
//参考类型
List=newlist();
Add(newtest(){Value=1});
Add(newtest(){Value=2});
var newrefList=refItems.ToList();
refItems.ForEach(cc=>Console.WriteLine(cc.Value));
ForEach(cc=>Console.WriteLine(cc.Value));
refItems[0]。Value=10;//这反映在两个列表中。因为对象相同,但您更改了值。
refItems.ForEach(cc=>Console.WriteLine(cc.Value));
ForEach(cc=>Console.WriteLine(cc.Value));
//如果您实际上更改了一个列表中的ref,那么它将不会反映
refItems[0]=newtest(){Value=30};
refItems.ForEach(cc=>Console.WriteLine(cc.Value));
ForEach(cc=>Console.WriteLine(cc.Value));
Console.ReadLine();
}
公开课考试
{
公共int值{get;set;}
}
}
如果您在列表中使用它(
list=list.ToList()
),它就毫无意义,也没有任何作用。如果您使用它来创建一个新列表(var list2=list1.ToList()
),它将创建该列表的一个副本(与var list2=list1
的引用一样)。不会有开销。collection.ToList()
,除非集合类型有一个名为的方法。ToList()
将始终创建一个新列表,即使该集合是一个要开始的列表。所以它什么也不做。它将使用ICollection.CopyTo
。它调用newlist(List)
,后者依次调用List.CopyTo
,后者调用Array.CopyTo
,速度非常快。它可能是O(n)
,但经过高度优化
class Program
{
static async Task Main(string[] args)
{
//Value Type
List<int> valueTypeitems = new List<int>();
valueTypeitems.Add(1);
valueTypeitems.Add(2);
var newlist = valueTypeitems.ToList();
valueTypeitems[0] = 3; // This will only reflect in first list.
valueTypeitems.ForEach(cc => Console.WriteLine(cc));
newlist.ForEach(cc => Console.WriteLine(cc));
//Reference type
List<Test> refItems = new List<Test>();
refItems.Add(new Test() { Value = 1 });
refItems.Add(new Test() { Value = 2 });
var newrefList = refItems.ToList();
refItems.ForEach(cc => Console.WriteLine(cc.Value));
newrefList.ForEach(cc => Console.WriteLine(cc.Value));
refItems[0].Value = 10; //This reflect in both list. As object is same but you change value.
refItems.ForEach(cc => Console.WriteLine(cc.Value));
newrefList.ForEach(cc => Console.WriteLine(cc.Value));
//if you actually change ref in one list then it will not reflect
refItems[0] = new Test() { Value = 30 };
refItems.ForEach(cc => Console.WriteLine(cc.Value));
newrefList.ForEach(cc => Console.WriteLine(cc.Value));
Console.ReadLine();
}
public class Test
{
public int Value { get; set; }
}
}