.NET List <T> Concat 대 AddRange


답변:


123

그들은 완전히 다른 의미를 가지고 있습니다.

AddRange는 목록에 다른 항목을 추가하여 목록을 수정합니다.

Concat은 목록을 수정하지 않고 목록과 다른 항목을 포함하는 새 시퀀스를 반환합니다.

원하는 의미를 가진 것을 선택하십시오.


1
따라서 타이트한 루프를 사용하면 모든 내부 신규 및 GC로 인해 성능이 저하되지 않도록 범위 추가를 사용하는 것이 훨씬 낫습니다.
johnc

45
실제로 지연된 실행으로 인해 Concat을 사용 하면 객체 할당을 피할 수 있기 때문에 더 빠를 것입니다. Concat은 아무것도 복사하지 않고 목록 사이에 링크를 생성하기 때문에 열거 할 때 하나의 끝에 도달하면 투명하게 시작으로 이동합니다. 다음의!
Greg Beech

36

큰 차이점은 AddRange는 호출되는 목록을 변경하는 반면 Concat은 새 목록을 생성한다는 것입니다. 따라서 그들은 다른 용도를 가지고 있습니다.

또한 Concat은 모든 IEnumerable에 적용되는 확장 메서드이며 새 목록을 생성하려면 .ToList ()가 필요한 IEnumerable을 반환합니다.

기존 목록의 내용을 확장하려면 AddRange를 사용하십시오.

두 개의 IEnumerable 소스에서 새 목록을 만드는 경우 .ToList와 함께 Concat을 사용하십시오. 이것은 소스를 변경하지 않는 품질을 가지고 있습니다.

두 개의 List (또는 다른 IEnumerable)의 내용 만 열거해야하는 경우 매번 Concat을 사용하면 통합 목록을 보유하기 위해 실제로 새 메모리를 할당하지 않는 이점이 있습니다.


3
+1, 실제로 'tolist'를 잊은 경우 concat은 아무 작업도하지 않습니다
smirkingman

7

이 두 구조의 차이점에 대해 이야기하고 성능을 비교하는 흥미로운 기사를 찾았습니다.

주요 아이디어는 AddRange가 대규모 컬렉션에 대해 훨씬 빠르다는 것입니다.

여기에 링크가 있습니다

도움이 되었기를 바랍니다,


1
나는 비교 테스트를 한 적이 ConcatAddRangeA를 List<KeyValuePair<string, string>>1000 개 요소, 연결된 / 100 시간을 추가하고와 AddRange매우 빨랐다. : 결과는 이러한했다 AddRange13 MS, Concat().ToList()16,000 MS, 그리고 ConcatIEnumerable만 일을 ToList끝 : 2,700 MS.
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.