如何在C#中不使用foreach
将一个List
中的项目转移到另一个List
中?
List<Int32> copy = new List<Int32>(original);
或者如果你正在使用 C# 3 和 .NET 3.5,并且使用了 Linq,你可以这样做:
List<Int32> copy = original.ToList();
我看到这个答案仍在得到投票。好吧,这有一个秘密:上面的答案仍在使用foreach。请不要再投票了。
MyClass
而不是 Integer
,它会复制项目还是只是引用它们? - Pedro MoreiralstStudentClass
是一个 IEnumerable<StudentClass>
,它就可以与所有类型一起使用。如果您遇到其他情况,请提供更多信息。请注意,翻译后的内容意思和原文保持一致,但更加通俗易懂。 - Lasse V. Karlsenoriginal.Select(o => new Complex(o)).ToList()
来获取一个新对象列表,而不是复制引用。 - Luke T O'Brien要将一个已经存在的列表的内容添加到另一个列表中,您可以使用:
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);
如果你想复制前三个元素
List<string> lstNew = lstTest.GetRange(0, 3);
AddRange
在文档中没有明确指定它是通过复制还是仅添加对象的引用,但如果您搜索实现,它使用Array.Copy
(静态)来复制数据。 - Paul-Sebastian Manole如果需要将单个属性复制到另一个列表中,可以使用以下方法:
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;
}
使用Linq轻松映射不同的列表集,无需使用for循环
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();
除了前面给出的答案,如果你想要“列表中的对象”的副本,那么可以使用 Select
并制作副本。(而其他答案则是“复制列表”,而这个答案是“副本列表”)。
假设你的项目有一个 Copy
方法:
List<MyObject> newList = oldList.Select(item => item.Copy()).ToList();
或者您可以使用构造函数从先前的对象创建一个新对象:
List<MyObject> newList = oldList.Select(item => new MyObject(item)).ToList();
Select
的结果是一个 IEnumerable<MyObject>
,如果你的目标是向现有列表中添加内容,你可以将其传递给 AddRange
。public static List<string> GetClone(this List<string> source)
{
return source.Select(item => (string)item.Clone()).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 );
}
List<int> i=original.Take(original.count).ToList();
ToList()
呢? - nawfal