将列表分配给另一个列表按值而不是引用

本文关键字:列表 引用 分配 另一个 | 更新日期: 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();

将列表<T>分配给另一个列表<T>按值而不是引用

您可以尝试使用采用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

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