C #을 사용하는 .NET에서 둘 이상의 목록을 하나의 단일 목록으로 변환 할 수 있습니까?
예를 들어
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
답변
LINQ Concat
및 ToList
메소드를 사용할 수 있습니다 .
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);
( 효율성 AddRange
을 ICollection<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;
}
도움이 되었기를 바랍니다.