按值而不是引用将 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<T>
的List<T>
构造函数。示例:
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<T>
类的类型而改变。问题是关于列表的浅对深复制,而不是列表中的项目。【参考方案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>) 按值接受参数?
Obj-C,iOS,我如何按值而不是键排序,sortedArrayUsingSelector,目前@selector(compare:)]