Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分配列表<;T>;转到另一个列表<;T>;按值而非引用_C#_List - Fatal编程技术网

C# 分配列表<;T>;转到另一个列表<;T>;按值而非引用

C# 分配列表<;T>;转到另一个列表<;T>;按值而非引用,c#,list,C#,List,好的,我有从db中提取的列表list1,我想临时保存到列表list2,在我的列表1上执行一些操作,将其保存到db,然后使用list2播放并保存到db。问题是,因为在我更改列表1中的某些字段后,is是通过引用传递的,所以列表2已经更新了 有没有办法将整个列表作为值而不是引用传递 下面是一些代码,以使其更清晰: var CurrentMenuItems = dbContext.menu_items.Where(m => m.optgroup == currentGroup &&

好的,我有从db中提取的列表list1,我想临时保存到列表list2,在我的列表1上执行一些操作,将其保存到db,然后使用list2播放并保存到db。问题是,因为在我更改列表1中的某些字段后,is是通过引用传递的,所以列表2已经更新了

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

下面是一些代码,以使其更清晰:

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();
var CurrentMenuItems=dbContext.menu items.Where(m=>m.optgroup==currentGroup&&m.day\u id==menuItem.day\u id).ToList();
列表MenuItemsToBeedEdataTerSubmitChanges=CurrentMenuItems;//我们需要通过值来存储它,以便以后可以更新它
字节项增加=50;//存储临时值,以避免重复输入项目编号
foreach(CurrentMenuItems中的var项)
{
item.optgroup=nextGroup;
item.item=项目增加;
项目增加++;
}
var menuitemstobereplace=dbContext.menu items.Where(m=>m.optgroup==nextGroup&&m.day\u id==menuItem.day\u id)。ToList();//我们要移动此组中的所有项目
dbContext.SubmitChanges();
foreach(菜单项中的var项已放置)
{
item.optgroup=当前组;
item.item=(字节)(item.item-1);
}
dbContext.SubmitChanges();
//首次保存后,更新第一组菜单项
foreach(MenuItemStobeedEdetaTersubmitChanges中的var项)
{
item.optgroup=nextGroup;
item.item=(字节)(item.item+1);
}
dbContext.SubmitChanges();

您可以尝试使用接受
IEnumerable
列表
构造函数。例如:

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 originalList=new List(){0,1,2};
列表复制列表=新列表(原始列表);
复制列表[2]=3;//原创作家[2]仍然是2
列表列表2=新列表(列表1);
这将防止您引用其他列表,因为这些值是复制的


请参阅:

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

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

var t = f.ToList();
IList f=新列表();
var t=f.ToList();

请发布一些代码,让我们确切地了解您正在做什么以及哪里出了问题。现在还不清楚你到底需要这本书有多深,你的问题正在吸引着猜测性的答案。当这个问题变得更清楚时,我将删除我的否决票。你可以克隆列表,如图所示。什么样的元素存储在列表中?@AdamBielecki在谷歌上快速搜索“deepcopy”会给你正确的答案。我会投否决票,但我没有足够的代表或你可以复制列表。AddRange(originalList)嗯,你尝试过引用类型而不是值类型吗?@Steve根据你用来实例化泛型
列表
类的类型,结果不会改变。问题是关于列表的浅复制与深复制,而不是列表中的项目。您走的是正确的道路,现在添加一个示例,您就有了正确的答案。@Steve问题没有询问复制列表中的所有项目;它只要求制作一份不会立即引用另一份清单的清单副本。
IList<string> f = new List<string>();

var t = f.ToList();