我想做的事情如下:
MyObject myObj = GetMyObj(); // Create and fill a new object
MyObject newObj = myObj.Clone();
Run Code Online (Sandbox Code Playgroud)
然后更改未在原始对象中反映的新对象.
我不经常需要这个功能,所以当有必要的时候,我已经使用了创建一个新对象然后单独复制每个属性,但它总是让我觉得有更好或更优雅的处理方式情况.
如何克隆或深度复制对象,以便可以修改克隆对象而不会在原始对象中反映任何更改?
我想要一个真正的深拷贝.在Java中,这很容易,但是你如何在C#中做到这一点?
如何List
在不使用的情况下将C#中包含的项目转移到另一个中foreach
?
这可能是一个微不足道的问题但是:由于ADO.NET实体框架会自动跟踪更改(在生成的实体中)并因此保留原始值,我如何回滚对实体对象所做的更改?
我有一个表单,允许用户在网格视图中编辑一组"客户"实体.
现在我有两个按钮"Accept"和"Revert":如果单击"Accept",我会调用Context.SaveChanges()
并将更改的对象写回数据库.如果单击"恢复",我希望所有对象获取其原始属性值.那个代码是什么?
谢谢
看看以下程序:
class Test
{
List<int> myList = new List<int>();
public void TestMethod()
{
myList.Add(100);
myList.Add(50);
myList.Add(10);
ChangeList(myList);
foreach (int i in myList)
{
Console.WriteLine(i);
}
}
private void ChangeList(List<int> myList)
{
myList.Sort();
List<int> myList2 = new List<int>();
myList2.Add(3);
myList2.Add(4);
myList = myList2;
}
}
Run Code Online (Sandbox Code Playgroud)
我假设myList
已经过去了ref
,输出会
3
4
Run Code Online (Sandbox Code Playgroud)
该列表确实"通过ref传递",但只有该sort
函数生效.以下声明myList = myList2;
无效.
所以输出实际上是:
10
50
100
Run Code Online (Sandbox Code Playgroud)
你能帮我解释一下这个行为吗?如果确实myList
没有通过ref(因为它看起来myList = myList2
没有生效),如何myList.Sort()
生效?
我甚至假设该语句不生效,输出为:
100
50
10
Run Code Online (Sandbox Code Playgroud) 我的一位同事带着一个关于这种方法的问题来找我,导致无限循环.实际的代码有点过于介绍这里,但基本上问题归结为:
private IEnumerable<int> GoNuts(IEnumerable<int> items)
{
items = items.Select(item => items.First(i => i == item));
return items;
}
Run Code Online (Sandbox Code Playgroud)
这应该(你会认为)只是一种非常低效的方式来创建列表的副本.我叫它:
var foo = GoNuts(new[]{1,2,3,4,5,6});
Run Code Online (Sandbox Code Playgroud)
结果是无限循环.奇怪.
我认为修改参数在风格上是一件坏事,所以我稍微改了一下代码:
var foo = items.Select(item => items.First(i => i == item));
return foo;
Run Code Online (Sandbox Code Playgroud)
那很有效.也就是说,该计划已经完成; 没有例外.
更多实验表明这也有效:
items = items.Select(item => items.First(i => i == item)).ToList();
return items;
Run Code Online (Sandbox Code Playgroud)
一样简单
return items.Select(item => .....);
Run Code Online (Sandbox Code Playgroud)
好奇.
很明显,问题与重新分配参数有关,但仅限于评估延迟超出该语句.如果我添加ToList()
它的工作原理.
对于出了什么问题,我有一个普遍的,模糊的想法.它看起来像是在Select
迭代它自己的输出.这本身有点奇怪,因为IEnumerable
如果它迭代的集合发生变化,通常会抛出.
我不明白,因为我并不熟悉这些东西如何工作的内部,这就是重新分配参数导致这个无限循环的原因.
是否有人对内部人员有更多的了解谁会愿意解释为什么无限循环发生在这里?
我注意到在c#中有一个列表方法:CopyTo - >复制到数组,是否有更好的方法可以复制到新列表?问题是,我想通过值检索列表,以便能够在显示它们之前删除项目,我不希望修改原始列表,这似乎也不容易实现,任何想法?
我正在尝试制作通用列表的深层副本,并且想知道是否有任何其他方法然后创建复制方法并实际上一次复制每个成员.我有一个看起来像这样的课程:
public class Data
{
private string comment;
public string Comment
{
get { return comment; }
set { comment = value; }
}
private List<double> traceData;
public List<double> TraceData
{
get { return traceData; }
set { traceData = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我有一份上述数据清单,即List<Data>
.我要做的是将List子集的跟踪数据绘制到图形上,可能需要对数据进行一些缩放或扫描.我显然不需要在列表中绘制所有内容,因为它们不适合屏幕.
我最初尝试使用该List.GetRange()
方法获取列表的子集,但似乎底层List<double>
是浅层复制而不是深度复制.当我使用List.GetRange()再次获取子集时,我获得了先前修改过的数据,而不是其他地方检索到的原始数据.
任何人都可以给我一个如何处理这个问题的方向吗?非常感谢.
可能重复:
如何在C#中克隆通用列表?
List<MyObject> a1 = new List<MyObject>();
var new1 = a1;
Run Code Online (Sandbox Code Playgroud)
现在,如果我改变,a1
那么new1
也将改变.
所以我的问题是如何正确克隆a1?
我有一个列表,其中包含来自操作的一些数据,我将其存储在内存缓存中.现在我想要另一个列表,其中包含基于某些条件的列表中的一些子数据.
从下面的代码可以看出,我正在对目标列表进行一些操作.问题是我对目标列表所做的任何更改也都在对mainList进行.我认为它因为参考是相同的或什么的.
我需要的是目标列表上的操作不会影响主列表中的数据.
List<Item> target = mainList;
SomeOperationFunction(target);
void List<Item> SomeOperationFunction(List<Item> target)
{
target.removeat(3);
return target;
}
Run Code Online (Sandbox Code Playgroud)