如何在没有foreach的情况下从列表复制项目到列表?


Answers:


554

您可以尝试以下方法:

List<Int32> copy = new List<Int32>(original);

或者,如果您在Linq中使用C#3和.NET 3.5,则可以执行以下操作:

List<Int32> copy = original.ToList();

14
如果项目是MyClass而不是类型Integer,它是否还会复制项目,或只是引用它们?
Pedro Moreira 2014年

5
不适用于非基本类型。List <StudentClass>复制=新的List <StudentClass>(lstStudentClass);
扎扎2015年

4
只要lstStudentClassIEnumerable<StudentClass>,它就适用于所有类型。如果您遇到其他情况,则需要提供更多信息。
Lasse V. Karlsen 2015年

1
(原始的)是什么意思; 最后
Rahul Chaudhari 2015年

1
您将一个集合传递给列表的构造函数,然后构造函数将将该集合的所有元素复制到新创建的列表中。
Lasse V. Karlsen 2015年

170

要将一个列表的内容添加到已经存在的另一列表中,可以使用:

targetList.AddRange(sourceList);

如果您只想创建列表的新副本,请参阅Lasse的答案。


6
@mrmillsy:好吧,他们做了不同的事情。我的回答集中在“我已经有一个列表,我想将其复制到该列表上”
Jon Skeet 2013年

真正。无论如何,我的问题可能更适合于新问题。感谢您的回复。
mrmillsy 2013年

1
如果要完全替换现有列表的内容,则应首先调用targetList.Clear()。
Ibraheem 2013年

33

有关元素列表

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);

5

这是如果需要将单个属性复制到另一个列表:

targetList.AddRange(sourceList.Select(i => i.NeededProperty));

4

此方法将创建列表的副本,但您的类型应可序列化。

采用:

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;
    }

序列化是否会严重影响性能?
Dan Def

0

好的,这很好用。从上面的建议中,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 );
}

2
这甚至不是答案。
Maciej Jureczko

嗯...好吧,上面的一些建议在Vis 17中根本不起作用,我已经清理了提供的最佳答案...并且嘿,...它起作用了:)
Jim Stevens

0

易于通过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();

-9

这是另一种方法,但与其他方法相比却差一点。

List<int> i=original.Take(original.count).ToList();

24
为什么要这么做?为什么不ToList()直接呢?
nawfal 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.