[C#] Select와 SelectMany의 차이점

나는 사이의 차이를 검색했습니다 SelectSelectMany하지만 적절한 답을 찾을 수 없어. LINQ To SQL을 사용할 때의 차이점을 알아야하지만 내가 찾은 것은 표준 배열 예입니다.

누군가 LINQ To SQL 예제를 제공 할 수 있습니까?



답변

SelectMany목록 목록을 반환하는 쿼리를 병합합니다. 예를 들어

public class PhoneNumber
{
    public string Number { get; set; }
}

public class Person
{
    public IEnumerable<PhoneNumber> PhoneNumbers { get; set; }
    public string Name { get; set; }
}

IEnumerable<Person> people = new List<Person>();

// Select gets a list of lists of phone numbers
IEnumerable<IEnumerable<PhoneNumber>> phoneLists = people.Select(p => p.PhoneNumbers);

// SelectMany flattens it to just a list of phone numbers.
IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);

// And to include data from the parent in the result: 
// pass an expression to the second parameter (resultSelector) in the overload:
var directory = people
   .SelectMany(p => p.PhoneNumbers,
               (parent, child) => new { parent.Name, child.Number });

.NET Fiddle의 라이브 데모


답변

많은 제품이 교차 제품을 취하는 SQL의 교차 조인 작업 과 유사 합니다.
예를 들어

Set A={a,b,c}
Set B={x,y}

많은 세트를 사용하여 다음 세트를 얻을 수 있습니다

{ (x,a) , (x,b) , (x,c) , (y,a) , (y,b) , (y,c) }

여기서 우리는 세트 A와 세트 B의 요소로 만들 수있는 모든 가능한 조합을 취합니다.

시도 할 수있는 LINQ 예제는 다음과 같습니다.

List<string> animals = new List<string>() { "cat", "dog", "donkey" };
List<int> number = new List<int>() { 10, 20 };

var mix = number.SelectMany(num => animals, (n, a) => new { n, a });

믹스는 평평한 구조에서 다음과 같은 요소를 갖습니다.

{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}


답변

여기에 이미지 설명을 입력하십시오

var players = db.SoccerTeams.Where(c => c.Country == "Spain")
                            .SelectMany(c => c.players);

foreach(var player in players)
{
    Console.WriteLine(player.LastName);
}
  1. 드 게아
  2. 알바
  3. 코스타
  4. 별장
  5. 부 스켓


답변

SelectMany()다른 방법으로 초 Select()또는 루프가 필요한 방식으로 다차원 시퀀스를 축소 할 수 있습니다 .

블로그 게시물에 대한 자세한 내용 .


답변

에 여러 가지 과부하가 SelectMany있습니다. 그 중 하나를 사용하면 계층을 순회하면서 부모와 자식 사이의 관계를 추적 할 수 있습니다.

: 다음 구조를 가지고 있다고 가정하십시오 League -> Teams -> Player.

플랫 플레이어 모음을 쉽게 반환 할 수 있습니다. 그러나 플레이어가 속한 팀에 대한 참조가 손실 될 수 있습니다.

다행히도 그러한 목적을위한 과부하가 있습니다.

var teamsAndTheirLeagues =
         from helper in leagues.SelectMany
               ( l => l.Teams
                 , ( league, team ) => new { league, team } )
                      where helper.team.Players.Count > 2
                           && helper.league.Teams.Count < 10
                           select new
                                  { LeagueID = helper.league.ID
                                    , Team = helper.team
                                   };

이전 예는 Dan의 IK 블로그 에서 가져 왔습니다 . 나는 당신이 그것을 볼 것을 강력히 권장합니다.


답변

SelectMany조인 바로 가기처럼 작동한다고 이해 합니다.

그래서 당신은 할 수 있습니다 :

var orders = customers
             .Where(c => c.CustomerName == "Acme")
             .SelectMany(c => c.Orders);


답변

선택은 소스 요소에서 결과 요소로의 간단한 일대일 투영입니다. Select- Many는 쿼리 식에 여러 from 절이있을 때 사용됩니다. 원래 시퀀스의 각 요소는 새 시퀀스를 생성하는 데 사용됩니다.