【问题标题】:Assign List<T> to another List<T> by value not reference [duplicate]按值而不是引用将 List<T> 分配给另一个 List<T> [重复]
【发布时间】:2013-03-15 03:54:26
【问题描述】:

好的,所以我有从 db 中提取的 List list1,我想将其临时保存到 List list2,对我的 list1 执行一些操作,将其保存到 db,然后使用 list2 并将其保存到 db。问题是,因为一旦我更改了 list1 中的某些字段,它就会通过引用传递,所以 list2 已经更新。

有没有办法将整个列表作为值而不是引用传递?

这里有一些代码让它更清楚:

var CurrentMenuItems = dbContext.menu_items.Where(m => m.optgroup == currentGroup && m.day_id == menuItem.day_id).ToList();

           List<menu_item> MenuItemsToBeEditedAfterSubmitChanges = CurrentMenuItems;// we need to store this by value, so we can update it later


            byte ItemIncrease = 50; // To store temp value so we can avoid duplicate entry for item number 

            foreach (var item in CurrentMenuItems)
            {
                item.optgroup = nextGroup;
                item.item = ItemIncrease;

                ItemIncrease++; 
            }

            var menuItemsToBeReplaced = dbContext.menu_items.Where(m => m.optgroup == nextGroup && m.day_id == menuItem.day_id).ToList(); // we want to move all items within this group

            dbContext.SubmitChanges();

            foreach (var item in menuItemsToBeReplaced)
            {
                item.optgroup = currentGroup;

                item.item = (byte)(item.item - 1);

            }

            dbContext.SubmitChanges();

            // After first save, update the first group of menu items

            foreach (var item in MenuItemsToBeEditedAfterSubmitChanges)
            {

                item.optgroup = nextGroup;
                item.item = (byte)(item.item + 1);

            }

            dbContext.SubmitChanges();

【问题讨论】:

  • 请发布一些代码,向我们展示您在做什么以及哪里出了问题。目前尚不清楚您需要此副本有多深,并且您的问题正在引起投机性答案。当这个问题变得更清楚时,我会删除我的反对票。
  • 您可以克隆列表,如下所示。 stackoverflow.com/questions/222598/…
  • List 中存储了哪些元素?
  • @AdamBielecki 在谷歌上快速搜索“深拷贝”会给你正确的答案。我会投反对票,但我没有足够的代表。

标签: c# list


【解决方案1】:

您可以尝试使用采用IEnumerable&lt;T&gt;List&lt;T&gt; 构造函数。示例:

List<int> originalList = new List<int>() { 0, 1, 2 };
List<int> copiedList = new List<int>(originalList);
copiedList[2] = 3; // originalList[2] still is 2

【讨论】:

  • 或者你可以复制List.AddRange(originalList)
  • 呃,你试过用引用类型而不是值类型吗?
  • @Steve 结果不会根据您用于实例化通用 List&lt;T&gt; 类的类型而改变。问题是关于列表的浅对深复制,而不是列表中的项目。
【解决方案2】:

只是另一个解决方案:

IList<string> f = new List<string>();

var t = f.ToList();

【讨论】:

    【解决方案3】:
    List<object> list2 = new List<object>(list1);
    

    这应该会阻止您引用其他列表,因为值已被复制。

    见:http://msdn.microsoft.com/en-us/library/fkbw11z0.aspx

    【讨论】:

      【解决方案4】:

      我认为给定的答案仅适用于值类型。 对于引用类型,您应该实现一个克隆方法,该方法将所有数据复制到同一类的新实例上 然后对于列表中的每个元素,您在另一个列表中添加克隆对象

      【讨论】:

      • 你在正确的轨道上,现在添加一个例子,你有正确的答案。
      • @Steve 这个问题没有问到关于复制列表中的所有项目;它只询问有关制作不立即引用另一个列表的列表副本。
      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      相关资源
      最近更新 更多