如何在没有 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,它是否也复制这些项目,或者只是引用它们? 不适用于非原始类型。 List 复制 = new List(lstStudentClass); 它适用于所有类型,只要lstStudentClassIEnumerable&lt;StudentClass&gt;,它就可以工作。如果您遇到其他情况,您需要提供更多信息。 (原文)是什么意思;最后 @PedroMoreira 对于复杂对象,您可以:origninal.Select(o =&gt; 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 循环的情况下将列表中的所有项目与整数进行比较

如何在没有列表定义的情况下将列表列添加到列表实例

如何在不创建嵌套数组的情况下将多个变量添加到数组

如何在没有 Javascript 的情况下将焦点设置到页面顶部?

如何在没有新服务器请求的情况下将下载的图像从父路由传递到子路由