동일한 유형의 항목이있는 목록 목록을 단일 항목 목록에 병합하는 방법은 무엇입니까?


209

이 질문은 혼란 스럽지만 다음 코드에서 설명하는 것처럼 훨씬 명확합니다.

   List<List<T>> listOfList;
   // add three lists of List<T> to listOfList, for example
   /* listOfList = new {
        { 1, 2, 3}, // list 1 of 1, 3, and 3
        { 4, 5, 6}, // list 2
        { 7, 8, 9}  // list 3
        };
   */
   List<T> list = null;
   // how to merger all the items in listOfList to list?
   // { 1, 2, 3, 4, 5, 6, 7, 8, 9 } // one list
   // list = ???

C # LINQ 또는 Lambda를 사용하여 가능한지 확실하지 않습니까?

기본적 으로 목록을 어떻게 연결하거나 " 평평하게 " 할 수 있습니까?

답변:


455

SelectMany 확장 방법 사용

list = listOfList.SelectMany(x => x).ToList();

73
SelectMany의 작동 방식을 인식하지 못하는 사람이 얼마나 많은 사람들이 자신의 "Flatten"확장명을 작성했는지 궁금합니다.
James Schek

1
이것이 작동하려면 왜 x => x가 필요합니까? 나는 보통 x => x +1과 같은 것을 보지만 x => x는 아닙니다.
SwimBikeRun

9
@SwimBikeRun SelectMany는 IEnumerable의 TSources를 가져 와서 목록의 각 TSource를 IEnumerable의 TResults로 변환 한 다음 모든 IEnumerables를 하나의 큰 것으로 연결하는 데 사용됩니다. 이 경우 시작할 목록의 목록이 있으므로이를 연결하려는 경우 TSource (IES의 Nnumerable)에서 TResults의 IEnumerable로 매핑하는 함수가 ID 함수 (x => x)입니다. 이것은 실제로 각 TSource가 이미 목록이기 때문에 각 TSource를 목록으로 바꾸는 추가 단계가 필요없는 특별한 경우입니다.
Sean

@JaredPar이 로직을 list <list <list <T >>>에 적용 할 수 있습니까?
Tk1993

4
@TusharKukreti 물론, 그냥 사용하십시오list.SelectMany(x => x.SelectMany(y => y)).ToList();
Brandon Kramer

13

C # 통합 구문 버전은 다음과 같습니다.

var items =
    from list in listOfList
    from item in list
    select item;

약간 혼란 스럽지만 훌륭합니다. 이것 어때? var items = 항목의 목록에서 (목록의 목록에서 목록 선택) 항목 선택
David.Chu.ca

4
'double from'은 SelectMany와 동일합니다. SelectMany는 아마도 가장 강력한 LINQ 메서드 (또는 쿼리 연산자) 일 것입니다. 이유를 알아 보려면 Google "LINQ SelectMany Monad"를 통해 알고 싶은 것보다 더 많은 것을 발견하십시오.
Richard Anthony Hein

3
"LINQ SelectMany Monad"를 인터넷 검색 할 때 따옴표를 포함하지 마십시오. 여기로 다시 연결됩니다.
Oxin

12

당신은 이것을 의미합니까?

var listOfList = new List<List<int>>() {
    new List<int>() { 1, 2 },
    new List<int>() { 3, 4 },
    new List<int>() { 5, 6 }
};
var list = new List<int> { 9, 9, 9 };
var result = list.Concat(listOfList.SelectMany(x => x));

foreach (var x in result) Console.WriteLine(x);

결과 : 9 9 9 1 2 3 4 5 6


또는 Concat () 대신 list.AddRange ()를 사용하여 병합 된 항목을 기존 목록에 추가 할 수 있습니다.
dahlbyk

1

의 경우 List<List<List<x>>>등, 사용에

list.SelectMany(x => x.SelectMany(y => y)).ToList();

이것은 의견에 게시되었지만 내 의견으로는 별도의 답변을받을 가치가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.