Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在IEnumerable上使用ToList()方法<;T>;这已经是一个列表<;T>;_C#_.net_Linq - Fatal编程技术网

C# 在IEnumerable上使用ToList()方法<;T>;这已经是一个列表<;T>;

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) 类程序 { 静态异步任务主(

对已经是列表的IEnumerable使用ToList()方法:

  • 它会创建一个新的列表吗
  • 在性能方面:其复杂性仍然是O(n)或更低
  • 它将创建一个新列表
  • 它将使用
    Array.CopyTo
    在内部复制元素,这是(从)O(n)

  • 您可以看到
    列表
    (这就是所谓的)构造函数的代码

    它很简单,但需要一些说明

  • 对。它将创建新的列表实例

  • 现在,当要创建新列表时。它将复制其中的所有项目。如果是valuetype,则复制实际值;如果是reference type,则复制该ref。 它是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; }
         }
     }