在C#中,如何将一个列表复制到另一个列表,从而在修改复制的列表时不修改原始列表

在C#中,如何将一个列表复制到另一个列表,从而在修改复制的列表时不修改原始列表,c#,list,copy,C#,List,Copy,我正在尝试使用AddRange或其他方式将一个列表复制到另一个列表,但似乎没有任何操作正常。无论我以何种方式尝试,如果我修改复制的列表,它也会修改原始列表。如果我使用foreach循环进行复制,这是唯一可行的方法 static void Main(string[] args) { var test = new List<Employee>{ new Employee { ID = "101", Name ="ABC1"}, new Employee{I

我正在尝试使用AddRange或其他方式将一个列表复制到另一个列表,但似乎没有任何操作正常。无论我以何种方式尝试,如果我修改复制的列表,它也会修改原始列表。如果我使用foreach循环进行复制,这是唯一可行的方法

    static void Main(string[] args)
    {
        var test = new List<Employee>{ new Employee { ID = "101", Name ="ABC1"}, new Employee{ID = "102", Name = "ABC2"}, new Employee{ ID = "103", Name = "ABC3"}};

        var tets2 = new List<Employee>(test);

        tets2[0].ID = "1-73";
        TestMethod(test.ToList());
    }

    private static void TestMethod(List<Employee> test)
    {
        var test1 = new List<Employee>(test);

        test1.AddRange(test);

        //This is the only one that work
        foreach(var item in test)
        {
            var x = new Employee { ID = item.ID, Name = item.Name };
            test1.Add(x);
        }

        test1[0].ID = "104";
    }
static void Main(字符串[]args)
{
var test=new List{new Employee{ID=“101”,Name=“ABC1”},new Employee{ID=“102”,Name=“ABC2”},new Employee{ID=“103”,Name=“ABC3”};
var tets2=新列表(测试);
tets2[0].ID=“1-73”;
TestMethod(test.ToList());
}
私有静态void测试方法(列表测试)
{
var test1=新列表(测试);
test1.AddRange(test);
//这是唯一有效的
foreach(测试中的var项目)
{
var x=新员工{ID=item.ID,Name=item.Name};
test1.Add(x);
}
test1[0].ID=“104”;
}

没有比这更简单的方法了吗?

它不是在修改列表,而是在修改列表中的项目。 您可以有两个或多个列表-每个列表都是
列表
-如果将项目复制到另一个列表或数组,则两个列表中的项目都是相同的项目

var x = new Employee { ID = "xyz", Name = "Bob" };
var list = new List<Employee>();
list.Add(x);
var array = new Employee[]{x};
var y = x;
y.ID = "abc";
添加到
newList
的项目与
sourceList
中的对象不同。它们是具有相同属性的新对象

如果您预见到需要经常这样做,那么您可以让
Employee
实现
ICloneable

public class Employee : ICloneable
{
    public string ID {get;set;}
    public string Name {get;set;}
    public object Clone()
    {
        return new Employee{ID=ID, Name=Name};
    }
}
或者,因为属性只是值类型,您可以这样做,将属性从源对象复制到新对象中

public class Employee : ICloneable
{
    public string ID {get;set;}
    public string Name {get;set;}
    public object Clone()
    {
        return this.MemberwiseClone();
    }
}
然后,要创建新列表,可以创建扩展方法:

public static class EmployeeExtensions
{
    public static List<Employee> ToClonedList(this IEnumerable<Employee> source)
    {
        return source.Select(employee => employee.Clone() as Employee).ToList();
    }
}

(要分割头发,您不必实现
ICloneable
。您只需编写一个复制对象的方法。
ICloneable
只是一个惯例,让其他人知道他们可以调用
.Clone()
,并创建克隆对象。)

可能的副本可以使用LINQ实现,我相信:
originalList.ForEach(x=>CopiedList.Add(newcopiedListObject{prop=x.prop,prop2=x.prop2})
public static class EmployeeExtensions
{
    public static List<Employee> ToClonedList(this IEnumerable<Employee> source)
    {
        return source.Select(employee => employee.Clone() as Employee).ToList();
    }
}
var myClonedList = oldList.ToClonedList();