[C#] C # .NET에서 두 개 이상의 목록을 하나로 병합

C #을 사용하는 .NET에서 둘 이상의 목록을 하나의 단일 목록으로 변환 할 수 있습니까?

예를 들어

public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);



답변

LINQ ConcatToList메소드를 사용할 수 있습니다 .

var allProducts = productCollection1.Concat(productCollection2)
                                    .Concat(productCollection3)
                                    .ToList();

이 작업을 수행하는보다 효율적인 방법이 있습니다. 위의 내용은 기본적으로 모든 항목을 반복하여 동적 크기의 버퍼를 만듭니다. 시작할 크기를 예측할 수 있으므로이 동적 크기 조정이 필요하지 않으므로 다음 사용할 있습니다.

var allProducts = new List<Product>(productCollection1.Count +
                                    productCollection2.Count +
                                    productCollection3.Count);
allProducts.AddRange(productCollection1);
allProducts.AddRange(productCollection2);
allProducts.AddRange(productCollection3);

( 효율성 AddRangeICollection<T>위해 특수한 경우 입니다.)

당신이 정말로해야하지 않는 한이 접근법을 취하지 않을 것입니다.


답변

지정된 category-Id에 대한 모든 제품이 포함 된 목록을 원한다고 가정하면 쿼리를 프로젝션으로 처리 한 다음 병합 작업을 수행 할 수 있습니다. 이를 수행하는 LINQ 연산자가 SelectMany있습니다..

// implicitly List<Product>
var products = new[] { CategoryId1, CategoryId2, CategoryId3 }
                     .SelectMany(id => GetAllProducts(id))
                     .ToList();

C # 4에서는 SelectMany를 단축하여 다음을 수행 할 수 있습니다. .SelectMany(GetAllProducts)

각 Id의 제품을 나타내는 목록이 이미 있으면 다른 사람들이 지적한 것처럼 연결 이 필요 합니다.


답변

LINQ를 사용하여 결합 할 수 있습니다.

  list = list1.Concat(list2).Concat(list3).ToList();

보다 전통적인 사용 방식 List.AddRange()이 더 효율적일 수 있습니다.


답변

한 번 봐 가지고 List.AddRange 병합 목록에를


답변

Concat 확장 방법을 사용할 수 있습니다 .

var result = productCollection1
    .Concat(productCollection2)
    .Concat(productCollection3)
    .ToList();


답변

list4 = list1.Concat(list2).Concat(list3).ToList();


답변

나는 이것이 단지 2 센트를 추가 할 수 있다고 생각한 오래된 질문이라는 것을 알고 있습니다.

당신이있는 경우 List<Something>[]에는 사용하여 가입 할 수 있습니다Aggregate

public List<TType> Concat<TType>(params List<TType>[] lists)
{
    var result = lists.Aggregate(new List<TType>(), (x, y) => x.Concat(y).ToList());

    return result;
}

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