【发布时间】:2010-12-29 11:02:31
【问题描述】:
如何在不使用foreach 的情况下将一个List 中包含的项目转移到另一个C# 中?
【问题讨论】:
-
如果您需要原始列表的深度克隆,您将在此相关问题中找到答案:stackoverflow.com/questions/222598/…
如何在不使用foreach 的情况下将一个List 中包含的项目转移到另一个C# 中?
【问题讨论】:
你可以试试这个:
List<Int32> copy = new List<Int32>(original);
或者如果您使用 C# 3 和 .NET 3.5 以及 Linq,您可以这样做:
List<Int32> copy = original.ToList();
我看到这个答案仍在获得支持。好吧,这是一个秘密:上面的答案仍然是使用 foreach。请不要再投票了。
【讨论】:
MyClass 而不是Integer,它是否也复制这些项目,或者只是引用它们?
lstStudentClass 是IEnumerable<StudentClass>,它就可以工作。如果您遇到其他情况,您需要提供更多信息。
origninal.Select(o => new Complex(o)).ToList() 获取新对象列表,而不是复制引用
要将一个列表的内容添加到另一个已经存在的列表中,您可以使用:
targetList.AddRange(sourceList);
如果您只想创建列表的新副本,请参阅最佳答案。
【讨论】:
对于元素列表
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);
【讨论】:
AddRange 没有在文档中指定它,它复制或只是通过引用添加对象,但如果您搜索实现,它使用 Array.Copy(静态)复制数据。
如果需要将单个属性复制到另一个列表:
targetList.AddRange(sourceList.Select(i => i.NeededProperty));
【讨论】:
此方法将创建列表的副本,但您的类型应该是可序列化的。
用途:
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;
}
【讨论】:
无需 for 循环即可通过 linq 轻松映射不同的列表集
var List1= new List<Entities1>();
var List2= new List<Entities2>();
var List2 = List1.Select(p => new Entities2
{
EntityCode = p.EntityCode,
EntityId = p.EntityId,
EntityName = p.EntityName
}).ToList();
【讨论】:
好的,这很好用 从上面的建议中,GetRange() 不适用于我将列表作为参数...所以从上面的帖子中使事情变得更甜:(谢谢大家:)
/* Where __strBuf is a string list used as a dumping ground for data */
public List < string > pullStrLst( )
{
List < string > lst;
lst = __strBuf.GetRange( 0, __strBuf.Count );
__strBuf.Clear( );
return( lst );
}
【讨论】:
public static List<string> GetClone(this List<string> source)
{
return source.Select(item => (string)item.Clone()).ToList();
}
【讨论】:
这里是另一种方法,但与其他方法相比要差一些。
List<int> i=original.Take(original.count).ToList();
【讨论】:
ToList()?