foreach없이 목록에서 항목으로 항목을 복사하려면 어떻게합니까?


답변:


554

당신은 이것을 시도 할 수 있습니다 :

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

또는 Linq와 함께 C # 3 및 .NET 3.5를 사용하는 경우 다음을 수행 할 수 있습니다.

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

14
항목이 유형이 MyClass아닌 유형 인 Integer경우 항목도 복사합니까 아니면 참조합니까?
Pedro Moreira

5
기본이 아닌 유형에서는 작동하지 않습니다. List <StudentClass> copy = 새 목록 <StudentClass> (lstStudentClass);
번쩍 거리는

4
그것은만큼, 모든 종류의 작동 lstStudentClass입니다 IEnumerable<StudentClass>, 그것은 작동합니다. 그렇지 않으면 더 많은 정보를 제공해야합니다.
Lasse V. Karlsen

1
(원본)의 의미는 무엇입니까? 마지막에
Rahul Chaudhari

1
컬렉션을 목록의 생성자에 전달하면 생성자가 해당 컬렉션의 모든 요소를 ​​새로 만든 목록에 복사합니다.
Lasse V. Karlsen

170

한 목록의 내용을 이미 존재하는 다른 목록에 추가하려면 다음을 사용하십시오.

targetList.AddRange(sourceList);

목록의 새 사본을 만들려면 Lasse의 답변을 참조하십시오.


6
@mrmillsy : 글쎄 그들은 다른 일을합니다. 제 답변은 "이미 목록이 있고 그 내용을 복사하고 싶습니다"
Jon Skeet

진실. 어쨌든 내 질문은 아마도 새로운 질문에 더 적합 할 것입니다. 답장을 보내 주셔서 감사합니다.
mrmillsy 2015 년

1
기존 목록의 내용을 완전히 바꾸려면 먼저 targetList.Clear ()를 호출하십시오.
Ibraheem

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

처음 3 개 요소를 복사하려는 경우

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

직렬화로 인해 성능이 크게 저하됩니까?
댄 데프

0

OK 이것은 잘 작동합니다. 위의 제안에서 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

마주 (17) 잘 확인 ... 음 제안 중 일부는 위에서 간단하게하지 않는 작품은 내가 제공하는 가장 좋은 대답을 정리 한 ... 그리고 헤이 프레스토 ... 그것은 : 작동
짐 스티븐스

0

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

-9

여기에 다른 방법이 있지만 다른 방법에 비해 조금 나쁩니다.

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

24
왜 그렇게 하시겠습니까? 왜 ToList()직접 하지 않습니까?
nawfal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.