LINQ SelectMany 자세히 보기
SelectMany
방법의 각종 중재와 용법을 소개하겠습니다.SelectMany
는 여러 가지 측면에서 GroupBy
와 반대로 본 시리즈의 LINQ에서 소개했습니다last time.GroupBy
단일 집합을 여러 개의 하위 집합으로 변환하고 SelectMany
하위 집합을 단일 합병 집합으로 편평하게 한다.그렇다면 이 평행은 실제로 어떻게 유용합니까?
기본 선택 많은 작업
네가 책 한 권을 가지고 있다고 상상해 봐.모든 책에는 편지가 아니라 한 글자 이상의 문자가 있을 수 있다.
만약 내가 나의 전체 라이브러리를 열거하고 모든 문자를 식별하고 싶다면, 어떤 책이든지, 이것은 많든 적든
SelectMany
수집한 기초 위에서 한 것이다.다시 말하면
SelectMany
집합의 모든 항목의 매거 가능한 속성을 하나의 평면 목록에 비추게 된다.이 코드의 가장 간단한 형식은 다음과 같다.
var people = books.SelectMany(b => b.Characters);
이 작업은 다음과 같은 문자 목록을 반환합니다.[
// Characters from Sphere
"Harry",
"Norman",
"Beth",
"Jerry",
// Characters from Jurassic Park
"Malcolm",
"Grant",
"Satler",
"Nedry",
"Hammond",
"Gennaro",
"Tim",
"Lex"
]
생성된 집합은 다중 집합이 아니라 단일 평면 집합입니다.이로 인해 SelectMany
방법과 거의 상반된다.우리가 제공한 플러그인 집합을 식별하는 함수
GroupBy
를 집합 선택기라고 부른다.결과 선택기 추가
LINQ는 결과 선택기라고 불리는 추가 재부팅을 제공합니다.
결과 선택기는 집합 중의 단일 노드를 다른 내용으로 바꾸는 간단한 함수이다.이것은 하나의 함수를 통해 이 점을 실현한다. 이 함수는 부모 집합 (think book, 이전 클래스 사용) 과 이 집합의 하위 집합 (같은 예시의 역할을 생각한다) 을 수신한다.
이 함수가 어떤 모양인지 보십시오.
SelectMany
함수의 입력으로 이 함수는 책 한 권과 문자를 포함하는 새로운 익명 형식을 되돌려줍니다.이제 생성된 컬렉션은 다음과 같이 각 문자에 더 많은 컨텍스트를 제공합니다.
[
{
"Book": "Sphere",
"Character": "Harry"
},
// Some results omitted
{
"Book": "Jurassic Park",
"Character": "Lex"
}
]
객체를 반환할 필요가 없습니다.우리의 예시에서 문자는 문자열이기 때문에 다음과 같은 문자열 포맷 작업을 쉽게 수행할 수 있습니다.이러한 간단한 코드는 더욱 간결하고 읽기 쉬운 출력을 만들어 냈다.
[
"Harry (Sphere)",
"Norman (Sphere)",
"Beth (Sphere)",
"Jerry (Sphere)",
"Malcolm (Jurassic Park)",
"Grant (Jurassic Park)",
"Satler (Jurassic Park)",
"Nedry (Jurassic Park)",
"Hammond (Jurassic Park)",
"Gennaro (Jurassic Park)",
"Tim (Jurassic Park)",
"Lex (Jurassic Park)"
]
멋있죠?보시다시피
(b, c)
중첩된 집합을 하나의 집합으로 평평하게 펼칠 수 있을 뿐만 아니라, 필요에 따라 이 집합의 대상을 다른 대상으로 변환하거나 비추기도 합니다.인덱스 기반 재부팅
때때로, 원본 집합에서 어떤 색인인지 알아야 합니다.이런 상황은 약간 보기 드물어야 하며, 통상적으로 두 개의 다른 데이터 원본을 한데 연결해야 한다.
이런 상황에 대해 LINQ는 우리가 지금까지 토론한 두 가지 방법에 중재를 제공했다.모든 재부팅을 사용하면 집합 선택기에 함수 파라미터를 추가할 수 있습니다. 이 선택기는 이 집합의 정수 기반 인덱스를 받아들일 것입니다.
이 방법이 어떻게 될 수 있는지 알아보려면 다음 예제를 참조하십시오.
여기에서 집합 선택기의
SelectMany
매개 변수는 b
대상에 대응하고 Book
매개 변수는 집합에서 0을 기반으로 하는 인덱스입니다.색인을 통해 i
집합에서 문자 목록을 가져옵니다. characters
결과 대상에 그 결과 선택기를 사용할 수 있습니다.마찬가지로 이것은 흔치 않은 재부팅이지만, 데이터가 여러 집합에서 분산된 상황에서 도움이 될 수 있다.
생각을 끝내다
내가 보기에
SelectMany
는 역연산SelectMany
보다 훨씬 유용하다.나는 네가 플러그인 목록을 집합으로 펴야 한다면
GroupBy
를 강력히 고려한다.또한 하나의 방법 호출에서 집합을 평평하게 하고 변환하는 능력은 매우 효과적이며 (가독성을 대가로) 후속 LINQ 호출을 연결시켜 결과 집합을 변환하는 수요를 줄일 수 있다.
마지막으로, 나는 플러그인 집합을 처리할 때, 당신은 흔하지 않지만 믿을 만한 기초 위에서 단독으로 사용할 것이라고 생각한다
SelectMany
.매핑 기능이 그다지 필요하지 않을 수도 있지만, 관건적인 장면에서는 여전히 매우 중요하다.만약 본고에서 사람을 곤혹스럽게 하는 부분이 있다면 저에게 알려주거나 방법팀Microsoft’s own documentation을 보십시오.
만약 당신이
SelectMany
의 사용법을 발견한다면, 나는 그것을 나의 기교 가방에 추가하고 싶다.당신이 뭘 발견했는지 알 수 있도록 댓글을 남겨주세요.게시물LINQ SelectMany in Depth이 먼저 Kill All Defects에 올라왔다.
Reference
이 문제에 관하여(LINQ SelectMany 자세히 보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/integerman/linq-selectmany-in-depth-37af텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)