【问题标题】:Why converting List to Array not referencing in c#?为什么将列表转换为数组而不是在 c# 中引用?
【发布时间】:2021-09-10 11:00:00
【问题描述】:

.Net 中的数组是引用类型。 给定上面的两个代码段。 问题:为什么设置值变量“fixedItem”影响第一段代码中的变量“数据”,但第二段代码不影响

第一个代码段:

        var data = new List<IList<int>>();
        data.Add(new List<int>() { 1, 2, 3 });
        data.Add(new List<int>() { 3, 8, 6,5 });
        data.Add(new List<int>() { 1, 2 });
        var fixedItem = data.Last();
        fixedItem[1] = 8;
        
        //Result:
        //data = {{1,2,3}, {3,8,6,5}, {1,8}}

第二段代码:

        var data = new List<IList<int>>();
        data.Add(new List<int>() { 1, 2, 3 });
        data.Add(new List<int>() { 3, 8, 6,5 });
        data.Add(new List<int>() { 1, 2 });
        var fixedItem = data.Last().ToArray();
        fixedItem[1] = 8;
          
        //Result:
        //data = {{1,2,3}, {3,8,6,5}, {1,2}}

【问题讨论】:

  • 你已经用ToArray创建了一个新的集合(值类型)
  • 如果您想要一致的结果,请使用 var fixedItem = data.Last().ToList();

标签: c# arrays list


【解决方案1】:

docs

根据文档 list.ToArray() 方法返回带有原始列表副本的数组

【讨论】:

    【解决方案2】:

    对于第一个版本,fixedItem 是外部列表的最后一项,即第三个内部列表。同一个例子。在引用该列表的任何地方都可以看到更改该列表。

    但是,在第二个版本中,您使用ToArray(),它在向量中创建列表内容的单独副本。你可以对你的独立副本做任何你喜欢的事情——它是一个不同的集合实例(和不同的集合类型)。更改它只会对引用副本的事物可见。原始列表不受影响因为它是不同的集合

    【讨论】:

      【解决方案3】:

      这是因为使用 ToArray 方法,您已经创建了原始列表的副本。

      Official documentation

      将 List 的元素复制到一个新数组中。

      【讨论】:

        【解决方案4】:

        这里涉及的东西很多。

        1. 当您在第二段中执行 ToArray 时,它实际上会创建新变量和新集合。

        2. 这里你已经创建了 int 列表,这个整数是值类型,所以当它创建新集合时,它会复制这些值并分配新的内存位置。

        3. 现在,如果您创建了一些引用类型(如类对象)而不是 int,那么如果您在一个集合中更改值,则会影响另一个集合。这里的变量是新的,但它仍然引用相同的内存位置。

        【讨论】:

          【解决方案5】:

          查看使用 Linq 中的 Last() 后创建的数据类型。 您会收到两种截然不同的数据类型。

          一个是列表,另一个是 int[]。它们具有完全不同的功能以及表示和处理数据的方式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-07
            • 2011-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多