[C#] Linq 기본 정리 C# 2010. 12. 22. 16:14


Linq 부분을 보면서 코드로 기본 적인 부분에 대해서 정리를 해 봤다.

class info
    {
        public int num;
        public string name;
        public info(int num, string name)
        {
            this.num = num;
            this.name = name;
        }
    }

    class info1
    {
        public int num;
        public string name;
        public info1(int num, string name)
        {
            this.num = num;
            this.name = name;
        }
    }

    class Program
    {
        static bool method(int num)
        {
            return 200 < num * 100;
        }

        static void Main(string[] args)
        {
            //기본 표현식
           
            //from 변수명 in 컬렉션 (where | orderby | let) select {select | group}

            //string[] msg = { "Hello", "Hi", "World", "Korea" };           
            //IEnumerable<string> query = from str in msg select str;
            //foreach (string temp in query)
            //{
            //    Console.WriteLine(temp);
            //}

            //string path = @"C:\";
            //var Files = from file in Directory.GetDirectories(path) select file;
            //foreach (var temp in Files)
            //{
            //    Console.WriteLine(temp);
            //}

            //info[] data = { new info(1, "1"), new info(2, "2"), new info(3, "3") };
            //IEnumerable<info> result = from temp in data select temp;
            //foreach (info temp in result)
            //{
            //    Console.WriteLine(temp.num + "  :  " + temp.name);
            //}

            //where 이용
            //List<int> data = new List<int> { 1, 2, 3, 4, 5, 6 };
            //IEnumerable<int> result = from int temp in data where (temp > 2) select temp;
            //foreach (int temp in result)
            //{
            //    Console.WriteLine(temp);
            //}

            //select 에서 데이터 가공
            //List<int> data = new List<int> { 1, 2, 3, 4, 5, 6 };
            //IEnumerable<int> result = from int temp in data where (temp > 1) select (temp + 3);
            //foreach (int temp in result)
            //{
            //    Console.WriteLine(temp);
            //}

            //두개 이상 select, 클래스를 그때 그때 생성 할 수도 있지만 부담스러움에 다음과 같이 처리
            //info[] data = { new info(1, "1"), new info(2, "2"), new info(3, "3") };
            //var result = from temp in data select new { num = temp.num, name = temp.name };
            //foreach (var temp in result)
            //{
            //    Console.WriteLine(temp.num + " : " + temp.name);
            //}

            //메서드 이용
            //List<int> data = new List<int> { 200, 300, 400 };
            //IEnumerable<int> result = data.Where(method);
            //foreach (int temp in result)
            //{
            //    Console.WriteLine(temp);
            //}
           
            //람다식 이용
            //List<int> data = new List<int> { 1000, 2000, 3000, 4000, 5000, 6000 };
            ////인자값 => (비교 판단)
            //var result = data.Where(x => (x * 12 >= 20000));
            //foreach (int temp in result)
            //{
            //    Console.WriteLine(temp);
            //}

            //data 합계
            //List<int> data = new List<int> { 1, 2, 3, 4, 5, 6 };
            //var result = (from int temp in data where temp > 2 select temp).Sum();
            //Console.WriteLine(result);

            //data 합집합
            //List<int> data1 = new List<int> { 1, 2, 3, 4, 6, 7 };
            //List<int> data2 = new List<int> { 5, 8 };
            //var result = (from temp in data1 select temp).Union(from temp in data2 select temp);
            //foreach (var temp in result)
            //{
            //    Console.WriteLine(temp);
            //}

            //정렬
            //info[] data = { new info(1, "31"), new info(2, "21"), new info(3, "13") };
            //IEnumerable<info> result = from temp in data orderby temp.name select temp;
            //IEnumerable<info> result = from temp in data orderby  temp.name descending select temp;
            //foreach (info temp in result)
            //{
            //    Console.WriteLine(temp.num + " : " + temp.name);
            //}

            //let 특정 데이터에 별칭 붙여서 이용
            //info[] data = { new info(1, "31"), new info(2, "21"), new info(3, "13") };
            //IEnumerable<info> result = from temp in data let num1 = temp.num where num1 > 1 select temp;
            //foreach (info temp in result)
            //{
            //    Console.WriteLine(temp.num + " : " + temp.name);
            //}

            //group by
            //info[] data = { new info(1, "31"), new info(2, "13"), new info(3, "13"), new info(3, "14") };
            //IEnumerable<IGrouping<string, info>> result = from temp in data group temp by temp.name;
            //foreach (IGrouping<string, info> temp in result)
            //{
            //    Console.WriteLine(temp.Key);
            //    foreach (info tem in temp)
            //    {
            //        Console.WriteLine(tem.num + " : " + tem.name);
            //    }
            //}

            //into let과 비슷하지만 그룹화, 조인 쿼리에 대해 별칭 부여, 그룹화 결과에 대한 정렬 또는 필터링시 이용
            //info[] data = { new info(1, "31"), new info(2, "13"), new info(3, "13"), new info(3, "14") };
            //var result = from temp in data group temp by temp.name into it where it.Key == "13" select it;
            //foreach (var tem in result)
            //{
            //    Console.WriteLine(tem.Key);
            //    foreach(info tem1 in tem)
            //    {
            //        Console.WriteLine(tem1.num);
            //    }
            //}

            //Sub Query
            //info[] data = { new info(1, "31"), new info(2, "13"), new info(3, "13"), new info(3, "14") };
            //var result = from temp in data where temp.num == ((from temp1 in data select temp1.num).Max()) select temp.name;
            //foreach (var temp in result)
            //{
            //    Console.WriteLine(temp);
            //}

            //Join
            info[] data = { new info(1, "31"), new info(2, "13"), new info(0, "13"), new info(3, "14") };
            info[] data1 = { new info(4, "31"), new info(2, "13"), new info(9, "13"), new info(3, "14") };
            var result = from temp in data join temp1 in data1 on temp.num equals temp1.num select new {temp.num,temp1.name};
            foreach(var temp in result)
            {
                Console.WriteLine(temp.num + " : " +temp.name);
            }

            Console.ReadLine();
        }
    }

매번 루프를 돌려서 처릴 했는데.. Linq를 왜 소홀히 했을까 싶은 생각이 드는 공부..

좀 더 깊게 봐야지 ㅠ_ㅠ