将列表分配给另一个列表按值而不是引用
本文关键字:列表 引用 分配 另一个 | 更新日期: 2023-09-27 18:05:51
好的,所以我有从数据库中提取的列表 list1,我想暂时将其保存到列表 list2,对我的列表 1 执行一些操作,将其保存到数据库,然后使用 list2 并将其保存到数据库。问题是,因为一旦我更改 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();
您可以尝试使用采用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
只是另一个解决方案:
IList<string> f = new List<string>();
var t = f.ToList();
List<object> list2 = new List<object>(list1);
这应该会阻止您引用其他列表,因为会复制这些值。
请参阅:http://msdn.microsoft.com/en-us/library/fkbw11z0.aspx
我认为给定的答案仅适用于值类型。对于引用类型,您应该实现一个克隆方法,该方法复制同一类的新实例上的所有数据然后,对于列表中的每个元素,您将克隆的对象添加到另一个列表中