두 개의 IEnumerable <T>을 새로운 IEnumerable <T>로 연결하는 방법은 무엇입니까?


201

IEnumerable<T>(와 같은 T) 의 두 인스턴스가 있습니다. 나는 새로운 인스턴스 IEnumerable<T>가 둘 모두를 연결 하고 싶어 합니다.

.Net에 내장 메소드가 있습니까? 아니면 직접 작성해야합니까?


9
code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b 를 책갈피에 추가 할 수 있습니다 .
C-Pound Guru

답변:


332

예, LINQ to Objects는 다음을 통해이를 지원합니다 Enumerable.Concat.

var together = first.Concat(second);

NB :한다 first또는 second당신이를받을 null의 경우 ArgumentNullException. 이것을 피하고 null을 빈 세트처럼 취급하려면 null 병합 연산자를 다음과 같이 사용하십시오.

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type

1
나는 항상 확장 방법을 찾는 것을 잊어 버린다.
Samuel Rossille

10
@SamuelRossille 또한 수행하려는 작업의 이름이 사용자가 수행 한 작업을 정확하게 호출하지 않는 경우에 가깝다는 것을 잊지 마십시오. 항상 IntelliSense를 탐색하면 많은 것을 배울 수 있습니다.
Adam Houldsworth

3
second = first.Concat (second)하는 것이 좋지 않습니까? 동시성 문제가 있습니까?
user2934433

4
@ user2934433 : 아뇨, 그건 괜찮습니다.
Jon Skeet

2
간단한 메모입니다. using System.Linq IDE 인텔리전스에서 원하는 확장 방법을 보려면 코드 파일 맨 위에 네임 스페이스 를 가져와야 합니다.
RBT

19

Concat메소드는 IEnumerable<T>열거자가 두 개의 전달 된 열거 가능 항목 (A 및 B라고 함)을 순서대로 사용하려고 시도하는 오브젝트 (Cat)를 리턴하여 구현하는 오브젝트를 리턴합니다. 전달 된 열거 가능 항목이 Cat의 수명 동안 변경되지 않고 부작용없이 읽을 수있는 시퀀스를 나타내는 경우 Cat을 직접 사용할 수 있습니다. 그렇지 않으면 결과 를 호출 ToList()하여 Cat사용 하는 것이 좋습니다 List<T>(A와 B의 내용의 스냅 샷을 나타냄).

일부 열거 가능 항목은 열거가 시작될 때 스냅 샷을 작성하고 열거 중 콜렉션이 수정되면 해당 스냅 샷에서 데이터를 리턴합니다. B가 그러한 열거 가능한 경우, Cat이 A의 끝에 도달하기 전에 발생하는 B에 대한 변경 사항은 Cat의 열거에 표시되지만 그 이후에 발생하는 변경 사항은 적용되지 않습니다. 이러한 의미는 혼동 될 수 있습니다. Cat의 스냅 샷을 찍으면 이러한 문제를 피할 수 있습니다.


7

솔루션에 아래 코드를 사용할 수 있습니다.

public void Linq94() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
    { 
        Console.WriteLine(n); 
    } 
}

0
// The answer that I was looking for when searching
public void Answer()
{
    IEnumerable<YourClass> first = this.GetFirstIEnumerableList();
    // Assign to empty list so we can use later
    IEnumerable<YourClass> second = new List<YourClass>();

    if (IwantToUseSecondList)
    {
        second = this.GetSecondIEnumerableList();  
    }
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.