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

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

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



답변

예, 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


답변

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

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


답변

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

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


답변

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


답변