如何在没有 foreach 的情况下将项目从列表复制到列表?
Posted
技术标签:
【中文标题】如何在没有 foreach 的情况下将项目从列表复制到列表?【英文标题】:How do I copy items from list to list without foreach? 【发布时间】:2010-12-29 11:02:31 【问题描述】:如何在不使用foreach
的情况下将一个List
中包含的项目转移到另一个C# 中?
【问题讨论】:
如果您需要原始列表的深度克隆,您将在此相关问题中找到答案:***.com/questions/222598/… 【参考方案1】:你可以试试这个:
List<Int32> copy = new List<Int32>(original);
或者如果您使用 C# 3 和 .NET 3.5 以及 Linq,您可以这样做:
List<Int32> copy = original.ToList();
我看到这个答案仍在获得支持。好吧,这是一个秘密:上面的答案仍然是使用 foreach。请不要再投票了。
【讨论】:
如果项目的类型是MyClass
而不是Integer
,它是否也复制这些项目,或者只是引用它们?
不适用于非原始类型。 ListlstStudentClass
是IEnumerable<StudentClass>
,它就可以工作。如果您遇到其他情况,您需要提供更多信息。
(原文)是什么意思;最后
@PedroMoreira 对于复杂对象,您可以:origninal.Select(o => new Complex(o)).ToList()
获取新对象列表,而不是复制引用【参考方案2】:
要将一个列表的内容添加到另一个已经存在的列表中,您可以使用:
targetList.AddRange(sourceList);
如果您只想创建列表的新副本,请参阅最佳答案。
【讨论】:
@mrmillsy:他们做不同的事情。我的回答集中在“我已经有一个列表,我想将内容复制到其中” 是的。无论如何,我的问题可能更适合新问题。不过感谢您的回复。 如果你想完全替换现有列表的内容,你应该先调用 targetList.Clear()。 这是正确的答案,因为复制意味着添加,而不是替换。 OP 要求复制项目而不是整个集合。【参考方案3】:对于元素列表
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
(静态)复制数据。【参考方案4】:
如果需要将单个属性复制到另一个列表:
targetList.AddRange(sourceList.Select(i => i.NeededProperty));
【讨论】:
【参考方案5】:此方法将创建列表的副本,但您的类型应该是可序列化的。
用途:
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;
【讨论】:
序列化是否会造成显着的性能损失?【参考方案6】:无需 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();
【讨论】:
【参考方案7】:好的,这很好用 从上面的建议中,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 );
【讨论】:
这甚至不是答案。 mmm...好吧,上面的一些建议在 Vis 17 中根本不起作用我已经清理了提供的最佳答案...嘿,presto...它有效:)跨度> 【参考方案8】:public static List<string> GetClone(this List<string> source)
return source.Select(item => (string)item.Clone()).ToList();
【讨论】:
仅代码的答案往往被认为是低质量的。您能否解释一下您的答案如何解决问题,以及这与现有答案有何不同。【参考方案9】:这里是另一种方法,但与其他方法相比要差一些。
List<int> i=original.Take(original.count).ToList();
【讨论】:
你为什么要这样做?为什么不直接ToList()
?以上是关于如何在没有 foreach 的情况下将项目从列表复制到列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不重新索引的情况下将项目添加到 laravel 列表集合中?
如何在不使用 for 循环的情况下将列表中的所有项目与整数进行比较