C\#LINQ 에서 GroupBy 사용 하기

13183 단어 C#LINQGroupBy
1.먼저 사용 할 클래스 를 준비 합 니 다.
1.Person 클래스:

class Person
  {
    public string Name { set; get; }
    public int Age { set; get; }
    public string Gender { set; get; }
    public override string ToString() => Name;
  }
2.사용 할 List 를 준비 하여 그룹 으로 나 누 기(GroupBy):

List<Person> personList = new List<Person>
    {
      new Person
      {
        Name = "P1", Age = 18, Gender = "Male"

      },
      new Person
      {
        Name = "P2", Age = 19, Gender = "Male",
      },
      new Person
      {
        Name = "P2", Age = 17,Gender = "Female",
      }
    };
둘째,첫 번 째 용법:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
공식 해석:지정 한 키 선택 기 함수 에 따라 시퀀스 의 요 소 를 그룹 으로 나 눕 니 다.
그룹 을 나 눌 집합 은 source 입 니 다.집합 에 있 는 모든 요소 의 유형 은 TSource 입 니 다.여기 서 첫 번 째 매개 변 수 는 key Selector 의 유형 은 Func입 니 다.TSource 요 소 를 이 의뢰 로 되 돌아 오 는 유형 TKey 에 따라 그룹 을 나 누 었 습 니 다.결 과 는 이미 분 리 된 집합(집합 중의 집합)입 니 다.
클 라 이언 트 테스트 코드 를 작성 하 는 것 은 다음 과 같 습 니 다:

var groups = personList.GroupBy(p => p.Gender);
    foreach (var group in groups)
    {
      Console.WriteLine(group.Key);
      foreach(var person in group)
      {
        Console.WriteLine($"\t{person.Name},{person.Age}");
      }
    }
위 코드 에서 지정 한 KeySelector 는 Person 류 의 Gender 속성 이기 때문에 이상 은 Gender(성별)에 따라 그룹 을 나 눕 니 다.저 희 는 두 개의 포 함 된 foreach 순환 을 사용 하여 그룹의 내용 을 콘 솔 에 인쇄 합 니 다.
groups 가 되 돌아 오 는 유형 은 IEnumerable이기 때문에 이상 되 돌아 오 는 유형 은 IEnumerable입 니 다.
Igouping은 그룹 을 나 눈 후의 집합 으로 내부 집합 요 소 는 Person 이 며,IGouping 은 Key 속성 이 있 으 며,유형 은 string(Gender 속성 유형 을 가리 키 는 말)으로 그룹 을 나 누 는 표지 입 니 다.
출력 결 과 는 다음 과 같 습 니 다.

그 등가 의 LINQ 문 구 는 다음 과 같다.

var groups = from p in personList
       group p by p.Gender;
이상 의 뜻 은 이렇게 이해 할 수 있 습 니 다.personList 에서 p 를 꺼 내 고 p 를 그룹 으로 나 눕 니 다.그룹의 근거(Key)를 p.Gender 로 사용 하고 그룹의 결 과 를 pGroup 에 저장 하 며 그룹의 결 과 를 선택 하여 하나의 집합 으로 합 칩 니 다.
3.두 번 째 용법:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);
공식 해석:지정 한 키 선택 기 함수 에 따라 시퀀스 의 요 소 를 그룹 으로 나 누고 지정 한 비교 기 를 사용 하여 키 를 비교 합 니 다.
첫 번 째 방법 보다 하나의 인자 가 더 많 습 니 다.그것 은 바로 같은 비교 기 입 니 다.TKey 가 사용자 정의 클래스 일 때 GroupBy 는 TKey 가 지정 한 클래스 에 따라 같은 비교 기 에 따라 그룹 을 나 눌 수 있 도록 하기 위해 서 입 니 다.
따라서 사용자 정의 클래스 가 그룹 을 어떻게 나 누 는 지 그룹 바 이 는 모 르 기 때문에 같은 비교 기 를 스스로 정의 해 야 합 니 다.
우선,personList 를 다음 과 같이 변경 합 니 다(밑줄 부분).

List<Person> personList = new List<Person>
    {
      new Person
      {
        Name = "P1", Age = 18, Gender = "Male"

      },
      new Person
      {
        Name = "P1", Age = 19, Gender = "Male",
      },
      new Person
      {
        Name = "P3", Age = 17,Gender = "Female",
      }
    };
그 다음 에 같은 비교 기 류 를 추가 하여 Person 을 그룹 으로 나 누 는 데 사용 합 니 다.

  class PersonEqualityComparer : IEqualityComparer<Person>
  {
    public bool Equals(Person x, Person y) => x.Name == y.Name;
    public int GetHashCode(Person obj) => obj.Name.GetHashCode();
  }
그 중에서 하나의 Person 에 대해 똑 같은 정 의 를 내 리 는 방법 을 정 의 했 습 니 다.IEquality Comparer을 실현 하면 됩 니 다.여기 서 Name 을 Person 류 와 같은 근거 로 합 니 다.
마지막 으로,현재 저 희 는 Person 클래스 를 그룹 으로 나 누고 클 라 이언 트 실험 코드 를 다음 과 같이 작성 합 니 다.

var groups = personList.GroupBy(p => p, new PersonEqualityComparer());
    foreach (var group in groups)
    {
      Console.WriteLine(group.Key.ToString());
      foreach(var person in group)
      {
        Console.WriteLine($"\t{person.Age},{person.Gender}");
      }
    }
이상 의 그룹 근 거 는 Person 클래스 이 고 자신 이 정의 한 Person 클래스 와 같은 비교 기 를 사 용 했 습 니 다.Name 이 같 으 면 한 그룹 으로 나 눕 니 다.
출력 결 과 는 다음 과 같 습 니 다.

4.세 번 째 용법:

public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);
공식 해석:지정 한 키 선택 기 함수 에 따라 시퀀스 의 요 소 를 그룹 으로 나 누고 지정 한 함수 로 각 그룹의 요 소 를 투영 합 니 다.
이것 은 첫 번 째 용법 보다 element Selector 가 하나 더 많 습 니 다.첫 번 째 용법 은 집합 자 체 를 TKey 에 따라 그룹 을 나 누고 자신(TSource)을 그룹 에 추가 하 는 것 입 니 다.현재 의 법칙 은 그룹 에 추가 하고 싶 은 요소 유형 을 선택 할 수 있 습 니 다.
클 라 이언 트 실험 코드 를 작성 하 는 것 은 다음 과 같 습 니 다:

var groups = personList.GroupBy(p => p.Gender, p=>p.Name);
    foreach (var group in groups)
    {
      Console.WriteLine(group.Key.ToString());
      foreach(var name in group)
      {
        Console.WriteLine($"\t{name}");
      }
    }
이 코드 는 p.Gender 에 따라 그룹 을 나 누고 p.Name 을 그룹 내 요소 로 합 니 다.
출력 결 과 는 다음 과 같 습 니 다.

그 등가 의 LINQ 문 구 는 다음 과 같다.

var groups = from p in personList
       group p.Name by p.Gender;
다섯 째,네 번 째 용법:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector);
공식 해석:지정 한 키 선택 기 함수 에 따라 시퀀스 의 요 소 를 그룹 으로 나 누고 각 그룹 과 키 에서 결과 값 을 만 듭 니 다.
이것 은 이전 용법 과 다 릅 니 다.이전 용법 은 결 과 를 그룹 으로 나 누고 IGrouping대상 으로 돌아 갑 니 다.현재 법칙 은 자신 이 정의 한 유형(TResult)을 되 돌려 주 는 것 입 니 다.자신 이 정의 한 유형 으로 돌아 가기 전에 두 개의 인자 가 들 어 갑 니 다.하 나 는 TKey 입 니 다.그룹 을 나 눌 때 지정 한 대상 이 고 다른 하 나 는 IEnumerable입 니 다.그룹 을 나 눈 후의 내부 대상 을 집합 하 다.
클 라 이언 트 실험 코드 를 작성 하 는 것 은 다음 과 같 습 니 다:

string GetPersonInfo(string gender, IEnumerable<Person> persons)
      {
        string result = $"{gender}:\t";
        foreach (var p in persons)
        {
          result += $"{p.Name},{p.Age}\t";
        }
        return result;
      }
      var results = personList.GroupBy(p => p.Gender,(g, ps) => GetPersonInfo(g,ps));
      foreach (var result in results)
      {
        Console.WriteLine(result);
      }
GetPersonInfo 는 국부 적 인 방법 으로 C\#7.0 이상 에 보인다.
이 코드 는 그룹 화 된 내용(하 나 는 TKey,p.Gender,다른 하 나 는 IEnumerable,IEnumerable)을 문자열 로 출력 하기 때문에 되 돌아 오 는 형식 을 문자열 집합 으로 합 니 다.
출력 결 과 는 다음 과 같 습 니 다.

그 등가 의 LINQ 문 구 는 다음 과 같다.

      var results = from p in personList
             group p by p.Gender into pGroup
             select GetPersonInfo(pGroup.Key, pGroup);
6.다섯 번 째 용법:

public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer);
공식 해석:키 선택 기 함수 에 따라 시퀀스 의 요 소 를 그룹 으로 나 눕 니 다.비교 기 를 사용 하여 키 를 비교 하고 지정 한 함 수 를 사용 하여 각 그룹의 요 소 를 투영 합 니 다.
세 번 째 용법 과 대체적으로 같 지만 같은 비교 기 가 하나 더 많아 서 조별 의 근거 로 사용 된다.
두 번 째 용법 을 사용 하 는 personList 와 PersonEquality Comparer 는 클 라 이언 트 실험 코드 를 다음 과 같이 작성 합 니 다.

var groups = personList.GroupBy(p => p, p => new { p.Age,p.Gender },new PersonEqualityComparer());
      foreach (var group in groups)
      {
        Console.WriteLine(group.Key.ToString());
        foreach (var name in group)
        {
          Console.WriteLine($"\t{name.Age},{name.Gender}");
        }
      }
상기 코드 의 그룹 근 거 는 Person 이 고 Person Equality Comparer 는 Person 으로 그룹 을 나 누 는 비교 기 이 며 각 그룹 내 에 익명 형식 으로 집합 합 니 다.
출력 결 과 는 다음 과 같 습 니 다.

7.여섯 번 째 용법:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector, IEqualityComparer<TKey> comparer);
공식 해석:지정 한 키 선택 기 함수 에 따라 시퀀스 의 요 소 를 그룹 으로 나 누고 각 그룹 과 키 에서 결과 값 을 만 듭 니 다.지정 한 비교 기 를 사용 하여 키 를 비교 합 니 다.
네 번 째 용법 과 대체적으로 같 지만 같은 비교 기 가 하나 더 많아 서 조별 의 근거 로 사용 된다.
두 번 째 용법 을 사용 하 는 personList 와 PersonEquality Comparer 는 클 라 이언 트 실험 코드 를 다음 과 같이 작성 합 니 다.

string GetPersonInfo(Person person, IEnumerable<Person> persons)
      {
        string result = $"{person.ToString()}:\t";
        foreach (var p in persons)
        {
          result += $"{p.Age},{p.Gender}\t";
        }
        return result;
      }
      var results = personList.GroupBy(p => p, (p, ps) => GetPersonInfo(p, ps),new PersonEqualityComparer());
      foreach (var result in results)
      {
        Console.WriteLine(result);
      }
이상 코드 의 그룹 근 거 는 Person 이 고 Person Equality Comparer 는 Person 으로 그룹 을 나 누 는 비교 기 입 니 다.각 그룹 은 하나의 Person 으로 집합 되 어 string 으로 종 류 된 문자열 을 출력 합 니 다.
출력 결 과 는 다음 과 같 습 니 다.

8.일곱 번 째 용법:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector);
공식 해석:지정 한 키 선택 기 함수 에 따라 시퀀스 의 요 소 를 그룹 으로 나 누고 각 그룹 과 키 에서 결과 값 을 만 듭 니 다.지정 한 함 수 를 사용 하여 각 그룹의 요 소 를 투영 합 니 다.
네 번 째 방법 과 유사 합 니 다.그룹 내 요 소 를 선택 할 뿐 원래 TSource 였 으 나 지금 은 TElement 으로 바 뀌 었 습 니 다.
클 라 이언 트 실험 코드 를 작성 하 는 것 은 다음 과 같 습 니 다:

string GetPersonInfo(string gender, IEnumerable<string> names)
      {
        string result = $"{gender}:\t";
        foreach (var name in names)
        {
          result += $"{name}\t";
        }
        return result;
      }
      var results = personList.GroupBy(p => p.Gender, (p=>p.Name) ,(g, ns) => GetPersonInfo(g, ns));
      foreach (var result in results)
      {
        Console.WriteLine(result);
      }
이 코드 는 Gender 로 그룹 을 나 누고 그룹 을 나 눈 정 보 를 문자열 로 조합 하여 콘 솔 에 출력 합 니 다.
출력 결 과 는 다음 과 같 습 니 다.

9.여덟 번 째 용법:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector, IEqualityComparer<TKey> comparer);
공식 해석:지정 한 키 선택 기 함수 에 따라 시퀀스 의 요 소 를 그룹 으로 나 누고 각 그룹 과 키 에서 결과 값 을 만 듭 니 다.지정 한 비교 기 를 사용 하여 키 값 을 비교 하고 지정 한 함 수 를 사용 하여 각 그룹의 요 소 를 투영 합 니 다.
일곱 번 째 용법 과 대체적으로 같 지만 같은 비교 기 가 하나 더 많아 서 조별 의 근거 로 사용 된다.
두 번 째 용법 을 사용 하 는 personList 와 PersonEquality Comparer 는 클 라 이언 트 실험 코드 를 다음 과 같이 작성 합 니 다.

var results = personList.GroupBy(p => p, (p=>new { p.Age,p.Gender}),
        (p, ns) => 
        {
          string result = $"{p.ToString()}:\t";
          foreach (var n in ns)
          {
            result += $"{n.Age},{p.Gender}\t";
          }
          return result;
        },new PersonEqualityComparer());
      foreach (var result in results)
      {
        Console.WriteLine(result);
      }
이 코드 는 Person 그룹 을 사용 하여 Person 비교 기 를 그룹의 근거 로 사용 하고 그룹 을 나 눈 정 보 를 문자열 로 조합 하여 콘 솔 에 출력 합 니 다.
출력 결 과 는 다음 과 같 습 니 다.

이상 은 C\#LINQ 에서 GroupBy 를 사용 하 는 상세 한 내용 입 니 다.C\#GroupBy 를 사용 하 는 자 료 는 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기