Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# LINQ OrderBy와 GroupBy 사용법 – 데이터 정렬과 그룹화 총정리

OrderBy는 배열이나 컬렉션의 요소를 오름차순 또는 내림차순으로 정렬할 때 사용하는 LINQ 정렬 연산자입니다.

GroupBy 연산자는 LINQ의 그룹화 연산자(Grouping Operators) 범주에 속합니다. 이 연산자는 평면적인 형태의 항목 시퀀스를 입력받아 특정 키를 기준으로 각 항목들을 그룹(IGrouping<K,V>)으로 구성하고, 그룹들의 시퀀스를 반환합니다.

GroupBy 예제

class ElectronicGoods {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public static List<ElectronicGoods> GetElectronicItems() {
        return new List<ElectronicGoods>() {
            new ElectronicGoods { Id = 1, Name = "Mobile", Category = "Phone"},
            new ElectronicGoods { Id = 2, Name = "LandLine", Category = "Phone"},
            new ElectronicGoods { Id = 3, Name = "Television", Category = "TV"},
            new ElectronicGoods { Id = 4, Name = "Grinder", Category = "Food"},
            new ElectronicGoods { Id = 5, Name = "Mixer", Category = "Food"},
        };
    }
}
class Program {
    static void Main() {
        //Category를 기준으로 그룹화
        var res = ElectronicGoods.GetElectronicItems().GroupBy(x => x.Category).Select(x => new {
            Key = x.Key,
            electronicGoods = x.OrderBy(c => c.Name)
        });
        foreach (var group in res) {
            Console.WriteLine("{0} - {1}", group.Key, group.electronicGoods.Count());
            Console.WriteLine("----------");
            foreach (var electronicGoods in group.electronicGoods) {
                Console.WriteLine(electronicGoods.Name + "\t" + electronicGoods.Category);
            }
            Console.WriteLine(); Console.WriteLine();
        }
        Console.ReadKey();
    }
}

출력 결과

Phone - 2
----------
LandLine Phone
Mobile Phone
TV - 1
----------
Television TV
Food - 2
----------
Grinder Food
Mixer Food

위 예제에서는 전자제품 목록을 Category를 기준으로 그룹화하고, 각 그룹 내부에서는 제품 이름(Name)을 기준으로 다시 오름차순 정렬했습니다. group.Key에는 그룹화 기준이 되는 카테고리 이름이 담기며, Count() 메서드를 통해 해당 그룹에 속한 항목의 개수를 확인할 수 있습니다.

OrderBy 예제

class ElectronicGoods {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public static List<ElectronicGoods> GetElectronicItems() {
        return new List<ElectronicGoods>() {
            new ElectronicGoods { Id = 1, Name = "Mobile", Category = "Phone"},
            new ElectronicGoods { Id = 2, Name = "LandLine", Category = "Phone"},
            new ElectronicGoods { Id = 3, Name = "Television", Category = "TV"},
            new ElectronicGoods { Id = 4, Name = "Grinder", Category = "Food"},
            new ElectronicGoods { Id = 5, Name = "Mixer", Category = "Food"},
        };
    }
}
class Program {
    static void Main() {
        //Category를 기준으로 오름차순 정렬
        var res = ElectronicGoods.GetElectronicItems().OrderBy(x => x.Category);
        foreach (var items in res) {
            Console.WriteLine(items.Name + "\t" + items.Category);
        }
        Console.ReadKey();
    }
}

출력 결과

Grinder Food
Mixer Food
Mobile Phone
LandLine Phone
Television TV

이 예제에서는 전체 목록을 Category 기준으로 오름차순 정렬하여 출력합니다. 만약 내림차순으로 정렬하고 싶다면 OrderByDescending(x => x.Category)를 사용하면 됩니다. 이처럼 OrderBy는 단일 조건 정렬에, GroupBy는 키 기반 데이터 묶음 처리에 유용하게 활용됩니다.