按值而不是引用将 List<T> 分配给另一个 List<T> [重复]

Posted

技术标签:

【中文标题】按值而不是引用将 List<T> 分配给另一个 List<T> [重复]【英文标题】:Assign List<T> to another List<T> by value not reference [duplicate] 【发布时间】: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();

【问题讨论】:

请发布一些代码,向我们展示您在做什么以及哪里出了问题。目前尚不清楚您需要此副本有多深,并且您的问题正在引起投机性答案。当这个问题变得更清楚时,我会删除我的反对票。 您可以克隆列表,如下所示。 ***.com/questions/222598/… List 中存储了哪些元素? @AdamBielecki 在谷歌上快速搜索“深拷贝”会给你正确的答案。我会投反对票,但我没有足够的代表。 【参考方案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 这个问题没有问到关于复制列表中的所有项目;它只询问有关制作不立即引用另一个列表的列表副本。

以上是关于按值而不是引用将 List<T> 分配给另一个 List<T> [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何按值而不是按引用复制对象[重复]

按值而不是按引用复制对象

在 Python 2 中,无论列表的内容如何,​​如何按值而不是引用复制复杂嵌套元素的列表

为啥 std::min(std::initializer_list<T>) 按值接受参数?

PHP 中的对象是按值分配还是按引用分配?

Obj-C,iOS,我如何按值而不是键排序,sortedArrayUsingSelector,目前@selector(compare:)]