ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#]LINQ
    C#/기초 2022. 2. 21. 15:50

    Group By

    using System;
    using System.Linq;
    
    namespace GroupBy
    {
        class Profile
        {
            public string Name { get; set; }
            public int Height { get; set; }
        }
    
        class MainApp
        {
            static void Main(string[] args)
            {
                Profile[] arrProfile = 
                {
                    new Profile(){Name="정우성", Height=186},
                    new Profile(){Name="김태희", Height=158},
                    new Profile(){Name="고현정", Height=172},
                    new Profile(){Name="이문세", Height=178},
                    new Profile(){Name="하하", Height=171}                
                };
    
                var listProfile = from profile in arrProfile
                                    orderby profile.Height
                                    group profile by profile.Height < 175 into g
                                    select new { GroupKey = g.Key, Profiles = g };	// g.key = true or false
    
                foreach (var Group in listProfile)
                {
                    Console.WriteLine($"- 175cm 미만? : {Group.GroupKey}");
    
                    foreach (var profile in Group.Profiles)
                    {
                        Console.WriteLine($"    {profile.Name}, {profile.Height}");
                    }                
                }   
            }
        }
    }

    Join

    using System;
    using System.Linq;
    
    namespace Join
    {
        class Profile
        {
            public string Name { get; set; }
            public int Height { get; set; }
        }
    
        class Product
        {
            public string Title { get; set; }
            public string Star { get; set; }
        }
    
        class MainApp
        {
            static void Main(string[] args)
            {
                Profile[] arrProfile = 
                {
                    new Profile(){Name="정우성", Height=186},
                    new Profile(){Name="김태희", Height=158},
                    new Profile(){Name="고현정", Height=172},
                    new Profile(){Name="이문세", Height=178},
                    new Profile(){Name="하하", Height=171}                
                };
    
                Product[] arrProduct = 
                {
                    new Product(){Title="비트",        Star="정우성"},
                    new Product(){Title="CF 다수",     Star="김태희"},
                    new Product(){Title="아이리스",    Star="김태희"},
                    new Product(){Title="모래시계",    Star="고현정"},
                    new Product(){Title="Solo 예찬",   Star="이문세"}
                };
    			//내부 조인
                var listProfile = 
                    from profile in arrProfile
                    join product in arrProduct on profile.Name equals product.Star
                    select new 
                    { 
                        Name = profile.Name, 
                        Work = product.Title,
                        Height = profile.Height
                    };
    
                Console.WriteLine("--- 내부 조인 결과 ---");
                foreach (var profile in listProfile)
                {
                    Console.WriteLine("이름:{0}, 작품:{1}, 키:{2}cm", 
                        profile.Name, profile.Work, profile.Height);
                }
    			//외부 조인
                listProfile = 
                    from profile in arrProfile
                    join product in arrProduct on profile.Name equals product.Star into ps
                    from sub_product in ps.DefaultIfEmpty(new Product(){Title="그런거 없음"})
                    select new
                    {
                        Name = profile.Name,
                        Work = sub_product.Title,
                        Height = profile.Height
                    };
    
                Console.WriteLine();
                Console.WriteLine("--- 외부 조인 결과 ---");
                foreach (var profile in listProfile)
                {
                    Console.WriteLine("이름:{0}, 작품:{1}, 키:{2}cm",
                        profile.Name, profile.Work, profile.Height);
                }
            }
        }
    }

    LINQ 연산 메소드 사용

    using System;
    using System.Linq;
    
    namespace MinMaxAvg
    {
        class Profile
        {
            public string Name { get; set; }
            public int Height { get; set; }
        }
    
        class MainApp
        {
            static void Main(string[] args)
            {
                Profile[] arrProfile = 
                {
                    new Profile(){Name="정우성", Height=186},
                    new Profile(){Name="김태희", Height=158},
                    new Profile(){Name="고현정", Height=172},
                    new Profile(){Name="이문세", Height=178},
                    new Profile(){Name="하하", Height=171}
                };
    
                var heightStat = from profile in arrProfile
                               group profile by profile.Height < 175 into  g
                               select new
                               {
                                   Group   = g.Key==true?"175미만":"175이상",
                                   Count   = g.Count(),
                                   Max     = g.Max(profile => profile.Height),
                                   Min     = g.Min(profile => profile.Height),
                                   Average = g.Average(profile => profile.Height)
                               };
    			// heightStat 그룹으로 나뉘어진 변수
                foreach (var stat in heightStat)
                {
                    Console.Write("{0} - Count:{1}, Max:{2}, ",
                        stat.Group, stat.Count, stat.Max);
                    Console.WriteLine("Min:{0}, Average:{1}",
                        stat.Min, stat.Average);
                }
            }
        }
    }

     


    아래 예제는 같은 결과.

    아이템 x를 x.Id로 그룹핑한 후 각 그룹 아이템 y의 마지막 아이템을 select

     

     

     


    출처: 이것이 C#이다.

    728x90

    'C# > 기초' 카테고리의 다른 글

    [C#]async, Task, await  (0) 2022.03.24
    [C#]Resources.resx 열기  (0) 2022.02.25
    [C#]문법  (0) 2022.02.18
    WritePixels  (0) 2021.12.24
    [C#]WPF Serial Port  (0) 2021.12.21

    댓글

Designed by Tistory.