C#에서 두 개 이상의 목록을 하나로 병합합니다.그물
에서 두 개 이상의 목록을 하나의 단일 목록으로 변환할 수 있습니까?C#을 사용하는 NET?
예를들면,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
LINQ 및 방법을 사용할 수 있습니다.
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>효율성을 위해.)
당신이 정말로 필요하지 않다면 저는 이런 접근법을 취하지 않을 것입니다.
지정된 범주-Id에 대한 모든 제품이 포함된 목록을 원한다고 가정하면 쿼리를 투영된 후 평탄화 작업으로 처리할 수 있습니다.이를 수행하는 LINQ 연산자가 있습니다.
// implicitly List<Product>
var products = new[] { CategoryId1, CategoryId2, CategoryId3 }
.SelectMany(id => GetAllProducts(id))
.ToList();
C# 4에서 다수 선택을 다음과 같이 단축할 수 있습니다..SelectMany(GetAllProducts)
각 ID에 대한 제품을 나타내는 목록이 이미 있는 경우 다른 사용자가 지적하는 것처럼 연결이 필요합니다.
LINQ를 사용하여 이들을 결합할 수 있습니다.
list = list1.Concat(list2).Concat(list3).ToList();
보다 전통적인 사용법List.AddRange()더 효율적일 수도 있습니다.
List.AddRange는 다음과 같은 요소를 추가하여 기존 목록을 변경합니다.
list1.AddRange(list2); // list1 now also has list2's items appended to it.
또는 현대의 불변 스타일에서 기존 리스트를 변경하지 않고 새 리스트를 투영할 수 있습니다.
다음과 같은 순서를 나타내는 콘캣list1의 항목, 다음 항목list2의 항목:
var concatenated = list1.Concat(list2).ToList();
완전히 같지는 않지만, 유니언은 다음과 같은 일련의 항목을 계획합니다.
var distinct = list1.Union(list2).ToList();
다음의 '값 유형 구별' 동작에 유의하십시오.Union참조 유형에 대해 작업하려면 클래스에 대해 동일성 비교를 정의해야 합니다(또는 기본 제공 비교 사용).record유형)을 선택합니다.
Concat 확장 방법을 사용할 수 있습니다.
var result = productCollection1
.Concat(productCollection2)
.Concat(productCollection3)
.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;
}
이게 도움이 되길 바랍니다.
list4 = list1.Concat(list2).Concat(list3).ToList();
// I would make it a little bit more simple
var products = new List<List<product>> {item1, item2, item3 }.SelectMany(id => id).ToList();
이렇게 하면 다차원 목록과 입니다.Many()를 선택하면 IE number of product로 평평하게 됩니다. 그런 다음 를 사용합니다.뒤에 ToList() 메서드를 입력합니다.
이미 언급했지만 여전히 유효한 옵션이라고 생각합니다. 귀사의 환경에서 더 나은 솔루션이 있는지 테스트해 보십시오.저의 경우, 사용하기source.ForEach(p => dest.Add(p))클래식보다 더 나은 성능을 제공합니다.AddRange왜 그런지는 낮은 수준에서 조사하지 않았습니다.
코드 예제는 https://gist.github.com/mcliment/4690433 에서 확인할 수 있습니다.
따라서 옵션은 다음과 같습니다.
var allProducts = new List<Product>(productCollection1.Count +
productCollection2.Count +
productCollection3.Count);
productCollection1.ForEach(p => allProducts.Add(p));
productCollection2.ForEach(p => allProducts.Add(p));
productCollection3.ForEach(p => allProducts.Add(p));
효과가 있는지 테스트해 보십시오.
고지 사항:나는 이 해결책을 옹호하는 것이 아닙니다.Concat한 바에 , 제 에서 이 가 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜAddRange하지만 저보다 훨씬 더 많은 지식을 가진 그는 이것이 말이 안 된다고 말합니다.비교하고 싶다면 요점이 있습니다.
하나의 목록으로 병합하거나 목록에 결합합니다.
두 목록의 유형이 동일하다는 한 가지 사실이 있어야 합니다.
예: 목록이 있는 경우
string기존 목록에 유형 문자열 목록이 있는 다른 목록을 추가할 수 있습니다. 그렇지 않으면 추가할 수 없습니다.
예:
class Program
{
static void Main(string[] args)
{
List<string> CustomerList_One = new List<string>
{
"James",
"Scott",
"Mark",
"John",
"Sara",
"Mary",
"William",
"Broad",
"Ben",
"Rich",
"Hack",
"Bob"
};
List<string> CustomerList_Two = new List<string>
{
"Perter",
"Parker",
"Bond",
"been",
"Bilbo",
"Cooper"
};
// Adding all contents of CustomerList_Two to CustomerList_One.
CustomerList_One.AddRange(CustomerList_Two);
// Creating another Listlist and assigning all Contents of CustomerList_One.
List<string> AllCustomers = new List<string>();
foreach (var item in CustomerList_One)
{
AllCustomers.Add(item);
}
// Removing CustomerList_One & CustomerList_Two.
CustomerList_One = null;
CustomerList_Two = null;
// CustomerList_One & CustomerList_Two -- (Garbage Collected)
GC.Collect();
Console.WriteLine("Total No. of Customers : " + AllCustomers.Count());
Console.WriteLine("-------------------------------------------------");
foreach (var customer in AllCustomers)
{
Console.WriteLine("Customer : " + customer);
}
Console.WriteLine("-------------------------------------------------");
}
}
특수한 경우: "List1의 모든 요소가 새 List2로 이동": (예: 문자열 목록)
List<string> list2 = new List<string>(list1);
이 경우 list2는 list1의 모든 요소와 함께 생성됩니다.
Concat 작업을 사용해야 합니다.
목록은 적지만 정확하게 몇 개인지 모를 경우 다음을 사용합니다.
listsOfProducts개체로 채워진 목록이 거의 없습니다.
List<Product> productListMerged = new List<Product>();
listsOfProducts.ForEach(q => q.ForEach(e => productListMerged.Add(e)));
빈 목록이 있고 이 목록을 채워진 목록과 병합하려면 Concat을 사용하지 말고 AddRange를 사용합니다.
List<MyT> finalList = new ();
List<MyT> list = new List<MyT>() { a = 1, b = 2, c = 3 };
finalList.AddRange(list);
언급URL : https://stackoverflow.com/questions/4488054/merge-two-or-more-lists-into-one-in-c-sharp-net
'programing' 카테고리의 다른 글
| .git는 제외 폴더를 무시하지만 특정 하위 폴더를 포함합니다. (0) | 2023.05.11 |
|---|---|
| Angular의 객체에 선택 요소 바인딩 (0) | 2023.05.11 |
| URL에서 파일 확장자를 가져올 수 있는 방법이 있습니까? (0) | 2023.05.11 |
| XAML에서 색상을 브러시로 변환하려면 어떻게 해야 합니까? (0) | 2023.05.06 |
| MVVM 패턴이 있는 WPF OpenFileDialog? (0) | 2023.05.06 |