【问题标题】:How do I copy items from list to list without foreach?如何在没有 foreach 的情况下将项目从列表复制到列表?
【发布时间】:2010-12-29 11:02:31
【问题描述】:

如何在不使用foreach 的情况下将一个List 中包含的项目转移到另一个C# 中?

【问题讨论】:

标签: c# oop list foreach copy


【解决方案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()
      猜你喜欢
      • 2011-12-29
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      相关资源
      最近更新 更多