是否有一种简单的方法可以基本上只使用此方法获取数据的副本而不是引用?我试过.ToArray().Where()但似乎仍然传递了一个引用.
例:
static void Main(string[] args)
{
List<ob> t = new List<ob>();
t.Add(new ob() { name = "hello" });
t.Add(new ob() { name = "test" });
ob item = t.Where(c => c.name == "hello").First();
// Changing the name of the item changes the original item in the list<>
item.name = "burp";
foreach (ob i in t)
{
Console.WriteLine(i.name);
}
Console.ReadLine();
}
public class ob
{
public string name;
}
Run Code Online (Sandbox Code Playgroud) 我知道这已经被覆盖了,但从我在帖子中理解的这应该有效.
示例代码:
我有一个自定义类型:
public class MyType
{
public List<MySubType> Movie { get; set; }
public List<int> Ranks { get; set; }
public string Location { get; set; }
public string Released { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个这种类型的List
List<MyType> myMovies = new List<MyType>();
Run Code Online (Sandbox Code Playgroud)
稍后在代码中我需要创建此列表的副本并更改它而不影响原始列表.
List<MyType> copyMovies = new List<MyType>(myMovies);
Run Code Online (Sandbox Code Playgroud)
但现在如果我从copyMovies中的列表中删除
copyMovies.Movie.RemoveAt(x);
Run Code Online (Sandbox Code Playgroud)
它从两个列表中删除
除非我完全遗漏了这篇文章,否则我应该能够更改副本列表,而不会影响原始文件.
我不知道该如何克隆BindingList<Object>。
我想创建一个不共享相同引用的现有列表的新副本。另一个麻烦是我的对象本身包含一个嵌套的BindingList<Object>。
我尝试了构造方法:
BindingList<Equation> NewEquationList =
new BindingList<Equation>(OldEquations.ToList());
Run Code Online (Sandbox Code Playgroud)
然后,我尝试遍历列表,设置新值:
BindingList<Equation> NewEquationList;
foreach (Equation OldEquation in OldEquations)
{
Equation NewEquation = new Equation()
{
NewEquation.ID = OldEquation.ID,
...
};
NewEquationList.Add(NewEquation);
}
Run Code Online (Sandbox Code Playgroud)
我试着隐含一个“复制构造函数”-我仍然不明白与上面的区别是什么,但它也不起作用。
我尝试将Equation类设置为[Serializable]并对该对象进行序列化/反序列化,但是我收到一条错误消息,指出在我的类中使用的PropertyChangedEventHandler未标记为Serializable。
我不认为制作引用类型的值副本将是一个复杂的过程,但是我在进行这项工作时遇到了困难。
我该怎么办?
编辑:
我的解决方案是将一个克隆方法添加到Equation的类中。我仍然不明白为什么这可行,而“复制构造函数”却行不通。
public Equation Clone()
{
Equation NewEquation = new Equation();
NewEquation.ID = this._ID;
...
//Nested BindingList:
NewEquation.EquationVariables = new BindingList<EquationVariable>
(this._EquationVariables.Select(EV => EV.Clone()).ToList());
return NewEquation;
}
Run Code Online (Sandbox Code Playgroud)
使用以上内容,以下代码成功创建了深层副本:
NewEquationList = new BindingList<Equation>
(OldEquations.Select(E => E.Clone()).ToList());
Run Code Online (Sandbox Code Playgroud)