我如何在c#中不使用foreach将一个列表中包含的项目转移到另一个列表中?
当前回答
用于元素列表
List<string> lstTest = new List<string>();
lstTest.Add("test1");
lstTest.Add("test2");
lstTest.Add("test3");
lstTest.Add("test4");
lstTest.Add("test5");
lstTest.Add("test6");
如果你想复制所有元素
List<string> lstNew = new List<string>();
lstNew.AddRange(lstTest);
如果你想复制前3个元素
List<string> lstNew = lstTest.GetRange(0, 3);
其他回答
这里有另一种方法,但它比其他方法差一点。
List<int> i=original.Take(original.count).ToList();
这是如果需要将一个属性复制到另一个列表:
targetList.AddRange(sourceList.Select(i => i.NeededProperty));
要将一个列表的内容添加到已经存在的另一个列表,您可以使用:
targetList.AddRange(sourceList);
如果您只是想创建一个列表的新副本,请参阅顶部的答案。
此方法将创建列表的副本,但您的类型应该是可序列化的。
使用:
List<Student> lstStudent = db.Students.Where(s => s.DOB < DateTime.Now).ToList().CopyList();
方法:
public static List<T> CopyList<T>(this List<T> lst)
{
List<T> lstCopy = new List<T>();
foreach (var item in lst)
{
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, item);
stream.Position = 0;
lstCopy.Add((T)formatter.Deserialize(stream));
}
}
return lstCopy;
}
添加到顶部的答案,如果你想要“列表中的对象”的副本,那么你可以使用Select并创建副本。(其他答案构成“a copy of a list”,而这个答案构成“a list of copies”)。
假设你的项目有一个Copy方法:
List<MyObject> newList = oldList.Select(item => item.Copy()).ToList();
或者你可以用构造函数从之前的对象中创建一个新对象:
List<MyObject> newList = oldList.Select(item => new MyObject(item)).ToList();
Select的结果是一个IEnumerable<MyObject>,你也可以传递给AddRange,例如,如果你的目标是添加到一个现有的列表。