我在SO处找到了许多解决方案,而且是通过序列化/反序列化(进入内存和后退)来处理对象的深层克隆.
它要求克隆的类标记为[Serializable].我碰巧把我的类(大部分都是)标记为[DataContract]因为我使用DataContractSerializer序列化为XML.
我只介绍了[Serializable]属性,因为需要对其中一些类实例进行深度克隆.但是,现在通过DCS进行序列化/反序列化的事情发生了,因为它不再起作用了 - 关于在反序列化时期望不同的XML元素的错误.如果我删除了[Serializable]错误消失了.
我有什么选择?我只想尽可能简单地深入克隆我的对象.
这是将List传递给方法并编辑该List而不修改原始List的唯一方法吗?
class CopyTest1
{
List<int> _myList = new List<int>();
public CopyTest1(List<int> l)
{
foreach (int num in l)
{
_myList.Add(num);
}
_myList.RemoveAt(0); // no effect on original List
}
}
Run Code Online (Sandbox Code Playgroud) 我有一堂课
public class Car()
{
public string Name;
public string Model;
}
Run Code Online (Sandbox Code Playgroud)
而且我有财产
List<Car> CarsA = new List<Car>();
CarsA.Add(new Car(){Name = "Verna",Model="Hyundai"});
CarsA.Add(new Car(){Name = "X1",Model="Bmw"});
Run Code Online (Sandbox Code Playgroud)
我还有另一个财产
List<Car> CarsB = new List<Car>();
Run Code Online (Sandbox Code Playgroud)
现在,我想将所有条目从CarsA添加到克隆/复制到CarsB,而不用将CarsA属性作为当前实例
(即我想为每个条目创建一个新对象并添加它)。
就像是
foreach(var car in CarsA)
{
Car newCar =new Car();
newCar.Name = car.Name;
newCar.Model = car.Model;
CarsB.Add(newCar);
}
Run Code Online (Sandbox Code Playgroud)
如果我不想实现ICloneable并且没有复制构造器怎么办?
当我尝试在列表中运行枚举器然后执行一些操作时,我正在开发一个小函数.(下面是我想要做的事情的想法.
当我试图删除时,我得到了一个"收藏无法修改",在我实际醒来之后,我意识到tempList必须刚刚被分配了myLists引用而不是myLists的副本.在那之后我试图找到一种说法
tempList = myList.copy
但似乎没有什么?我最后编写了一个小的for循环,然后将myLsit中的每个项目添加到tempList中,但我原以为会有另一种机制(如clone?)
所以我的问题:
如何将列表复制到另一个列表?
private myList as List (Of something)
sub new()
myList.add(new Something)
end sub
sub myCalledFunction()
dim tempList as new List (Of Something)
tempList = myList
Using i as IEnumerator = myList.getEnumarator
while i.moveNext
'if some critria is met then
tempList.remove(i.current)
end
end using
end sub
Run Code Online (Sandbox Code Playgroud)我有一个基类:abstract class Base和一些派生类:class Derived: Base,所有数据成员都在基类中。我有另一个通用列表:List<Base> list。现在我想Clone()对列表进行操作。我读过这篇文章,但发现我的情况有点复杂。由于基类是抽象的,因此不能通过复制构造函数或实现接口来克隆列表的元素ICloneable。但由于所有数据成员都在基类中,因此在派生类中一次又一次地编写相同的代码进行克隆是多余的。完成这项工作的最佳方法是什么?感谢您提供提示。
更新:附简化源代码
public class Point : ICloneable
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{ X = x; Y = y; }
public Point(Point p)
{
X = p.X; Y = p.Y;
}
public object Clone()
{
return MemberwiseClone();
}
}
public abstract class ObjectThatHasPosition : ICloneable
{
public Point …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)
它从两个列表中删除
除非我完全遗漏了这篇文章,否则我应该能够更改副本列表,而不会影响原始文件.
在 C# 中,如何模拟对象列表?
我正在尝试进行练习,它指定在单元测试的排列部分中我需要“模拟Book对象列表”。
创建 Book 对象的模拟列表的语法是什么?我尝试创建模拟 Book 对象并将它们添加到书籍列表中,但这不起作用。
public void Test_GetAllBooks_ReturnsListOfBooksItReceivesFromReadAllMethodOfReadItemCommand_WhenCalled()
{
//Arrange
Mock<ReadItemCommand> mockReadItemCommand = new Mock<ReadItemCommand>();
Catalogue catalogue = new Catalogue(mockReadItemCommand.Object);
Mock<Book> mockBook1 = new Mock<Book>();
Mock<Book> mockBook2 = new Mock<Book>();
List<Book> mockBookList = new List<Book>();
mockBookList.Add(mockBook1);
mockBookList.Add(mockBook2);
mockReadItemCommand.Setup(r => r.ReadAll()).Returns(mockBookList);
//Act
List<Book> actual = catalogue.GetAllBooks();
//Assert
Assert.AreSame(mockBookList, actual);
}
Run Code Online (Sandbox Code Playgroud)
这给我带来了 2 个编译错误,都是 CS1503,在我尝试将模拟书籍添加到我的书籍类型列表的两行中。
可能重复:
如何在C#中克隆通用列表?
嘿,我一直在尝试克隆一个列表,到目前为止,我发现了函数addRange,但我很确定它不克隆列表中的对象,但做一个浅的副本列表我想知道如何克隆列表谢谢提前.
我在下面想念的是什么?当我尝试list.Clone()克隆没有显示在列表中.
class Program
{
static void Main(string[] args)
{
List<Customer> list = new List<Customer>();
list.Clone() //There is no Clone method in the list
}
}
public static class Extensions
{
public static IList<T> Clone<T>(this IList<T> listToClone) where T : ICloneable
{
return listToClone.Select(item => (T)item.Clone()).ToList();
}
}
public class Customer
{
public string ContactName { get; set; }
public string City { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
如何在C#中克隆通用列表?
我想在C#中将列表复制到另一个列表.问题是现有方法如copyto从另一个列表创建新列表.但是,如果我对新列表进行一些更改,旧列表也会发生变化.它因为它们的引用类型行为.如果有任何方法(除了foreach循环)从另一个列表创建一个新列表,它不会引用同一个对象
我有一个问题,使用C#,如果我初始化一定名单,可以说List<T> exampleList使用其他预先存在的列表,可以说toModify这样的:List<T> exampleList = new List<T>(toModify)。当我稍后修改toModify列表时,新创建的列表也会修改自身。如果通过由基准的值不应该的值exampleList保持不变,因为它是从其他的一个产生的?
TLDR:当我更改第二个列表时,我使用另一个列表(第二个列表)初始化的列表的值会发生变化。我来自 Java 背景,无法理解为什么会发生这种情况。我总是必须使用克隆吗?
我的两个列表都被修改,我试图避免这种行为......
这里有什么问题?
我有一个'大'列表,我想删除itemsToRemoveList中存在的所有项目,但没有修改原始列表.
我简化了示例代码..
List<string> aList = new List<string>(){"My","name","is", "jeff"}; // cached full list
List<string> bList = aList; // initial copy
List<string> itemsToRemoveList = new List<string>(){"jeff"};
bList.RemoveAll(itemsToRemoveList.Contains); // remove only from copy
foreach (string s in aList)
{
Console.Write(s + " "); // expect "my name is jeff"
}
Console.WriteLine();
foreach (string s in bList)
{
Console.Write(s + " "); // expect "my name is"
}
// however this modifies both collections.
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)