将项目列表复制到另一个列表
Copy list of items to another list
我正在尝试将项目列表从 list1 复制到另一个列表 list2。我能做到。但是我不希望在 list2 中所做的更改反映在 list1 中。
class Program
{
static void Main(string[] args)
{
List<MyClass> list1 = new List<MyClass>();
list1.Add(new MyClass(){ID = 1, Name = "name1"});
list1.Add(new MyClass(){ID = 2, Name = "name2"});
list1.Add(new MyClass(){ID = 3, Name = "name3"});
//Copy items from list1 to list2
List<MyClass> list2 = new List<MyClass>(list1);
list1.ForEach(x => Console.WriteLine(x.Name)); //It shows the name as added
//Empty items in list2
list2.ForEach(x => x.Name = string.Empty);
//Print items in list1
list1.ForEach(x => Console.WriteLine(x.Name)); //It shows the name is empty
Console.ReadKey();
}
}
class MyClass
{
private int id;
public int ID
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
我希望有一个简单的方法。
如果你也想在其他地方使用这个功能,我想最好的方法是为 IList
创建一个扩展方法,如下所示:
static class Extensions
{
public static IList<T> Clone<T>(this IList<T> sourceList)
where T: ICloneable
{
return sourceList.Select(item => (T)item.Clone()).ToList();
}
}
要使用它,您应该更改 class 并使其成为 ICloneable
:
class MyList : ICloneable
{
public MyList(int idParam, string nameParam)
{
ID = idParam;
Name = nameParam;
}
public object Clone()
{
return new MyList(ID, Name);
}
private int id;
public int ID
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
由于这是一个引用类型,因此您要全部更改。您需要创建该实例的 copy:
public class MyClass
{
private int id;
public int ID
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public MyClass Copy()
{
return new MyClass
{
ID = this.ID,
Name = this.Name
};
}
}
现在您可以这样创建第二个列表:
List<MyClass> list2 = new List<MyClass>(list1.Select(x => x.Copy()));
当然你不需要那个方法。您也可以在 LINQ 查询中即时执行此操作:
List<MyClass> list2 = new List<MyClass>(list1.Select(x => new MyClass { ID = x.ID, Name = x.Name }));
另一个类似的方法是 copy-constructor。复制构造函数用于通过提供相同类型的另一个实例来初始化实例:
public class MyClass
{
private int id;
public MyClass(MyClass instance)
{
this.id = instance.ID;
this.name = instance.Name;
}
public int ID
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
现在您可以用这种方式用副本填充列表:
List<MyClass> list2 = new List<MyClass>(list1.Select(x => new MyClass(x)));
或 List.ConvertAll
:
List<MyClass> list2 = list1.ConvertAll(x => new MyClass(x));
如果您的元素是引用类型和类型实现 ICloneable
接口,您可以这样做:
list1.ForEach((item) =>
{
list2.Add((ICloneable)item.Clone());
});
如果您的元素类型没有实现 ICloneable
,您可以创建 "copy" 构造函数并执行如下操作:
list1.ForEach((item)=>
{
list2.Add(new MyList(item.ID, item.Name));
});
我正在尝试将项目列表从 list1 复制到另一个列表 list2。我能做到。但是我不希望在 list2 中所做的更改反映在 list1 中。
class Program
{
static void Main(string[] args)
{
List<MyClass> list1 = new List<MyClass>();
list1.Add(new MyClass(){ID = 1, Name = "name1"});
list1.Add(new MyClass(){ID = 2, Name = "name2"});
list1.Add(new MyClass(){ID = 3, Name = "name3"});
//Copy items from list1 to list2
List<MyClass> list2 = new List<MyClass>(list1);
list1.ForEach(x => Console.WriteLine(x.Name)); //It shows the name as added
//Empty items in list2
list2.ForEach(x => x.Name = string.Empty);
//Print items in list1
list1.ForEach(x => Console.WriteLine(x.Name)); //It shows the name is empty
Console.ReadKey();
}
}
class MyClass
{
private int id;
public int ID
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
我希望有一个简单的方法。
如果你也想在其他地方使用这个功能,我想最好的方法是为 IList
创建一个扩展方法,如下所示:
static class Extensions
{
public static IList<T> Clone<T>(this IList<T> sourceList)
where T: ICloneable
{
return sourceList.Select(item => (T)item.Clone()).ToList();
}
}
要使用它,您应该更改 class 并使其成为 ICloneable
:
class MyList : ICloneable
{
public MyList(int idParam, string nameParam)
{
ID = idParam;
Name = nameParam;
}
public object Clone()
{
return new MyList(ID, Name);
}
private int id;
public int ID
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
由于这是一个引用类型,因此您要全部更改。您需要创建该实例的 copy:
public class MyClass
{
private int id;
public int ID
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public MyClass Copy()
{
return new MyClass
{
ID = this.ID,
Name = this.Name
};
}
}
现在您可以这样创建第二个列表:
List<MyClass> list2 = new List<MyClass>(list1.Select(x => x.Copy()));
当然你不需要那个方法。您也可以在 LINQ 查询中即时执行此操作:
List<MyClass> list2 = new List<MyClass>(list1.Select(x => new MyClass { ID = x.ID, Name = x.Name }));
另一个类似的方法是 copy-constructor。复制构造函数用于通过提供相同类型的另一个实例来初始化实例:
public class MyClass
{
private int id;
public MyClass(MyClass instance)
{
this.id = instance.ID;
this.name = instance.Name;
}
public int ID
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
现在您可以用这种方式用副本填充列表:
List<MyClass> list2 = new List<MyClass>(list1.Select(x => new MyClass(x)));
或 List.ConvertAll
:
List<MyClass> list2 = list1.ConvertAll(x => new MyClass(x));
如果您的元素是引用类型和类型实现 ICloneable
接口,您可以这样做:
list1.ForEach((item) =>
{
list2.Add((ICloneable)item.Clone());
});
如果您的元素类型没有实现 ICloneable
,您可以创建 "copy" 构造函数并执行如下操作:
list1.ForEach((item)=>
{
list2.Add(new MyList(item.ID, item.Name));
});