NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 링큐 연산자. (Operators in LINQ - Union, Concat, Intersect, Distinct, Excep…

    페이지 정보

    본문

    C# 프로그래밍을 하다보면 링큐를 자주 사용하게 되는데요. 이 때 알아두면 유용한 확장 메서드에 대해 간단히 알아보겠습니다. 대부분 질의문(Query)을 통해 이미 처리 되었을수도 있지만, 부득이하게 Controller나 View에서 처리해야 하는 경우도 발생하게 됩니다. 고객의 요구 사항은 신비롭고 상상을 초월하니까요~

     

    뭐 그럴일은 없겠지만, 골드 맴버쉽 고객을 보여주는 화면에 실버 고객도 보여주고 싶을수도 있습니다. 이 때 그리드뷰에 같이 표시하는거죠. 이럴때는 각각의 질의문은 재사용하면서 하나로 합쳐줘야 합니다. 또는, 모든 고객 목록에서 특정 고객들을 제외할수도 있겠죠. 사실 이런것들은 모두 데이타베이스에서 처리가 가능합니다. 하지만, 이미 가져온 데이타를 조작해서 쉽게(?) 처리할 수 있는 문제를 어렵게 만드는 사람들이 가끔 있습니다. 예를 들면, 이 요구사항에 맞는 질의문을 다시 만들고, 호출하고 바인딩하는 일련의 작업을 처음부터 하는거죠-_-;

    이런 사람이 없을거 같죠? 의외로 있습니다^^;

     

    1. Union (합집합)

    네 그렇습니다. SQL의 Union과 동일한 효과를 나타냅니다. 아래 예제를 통해 확인 해보죠.

    Program.cs

    using System;
    using System.Linq;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] heroes = { "Super Man", "Bat Man", "Spider Man", "Eternity" };
                string[] heroines = { "Wonder Woman", "Invisible Woman", "Cat Woman", "Eternity" };
                var meeting = heroes.Union(heroines);
     
                foreach (var some in meeting)
                {
                    Console.WriteLine(some);
                }
     
                Console.ReadKey();
            }
        }
    }
    

     

     

    우선 결과를 먼저 확인해보죠.

    1tEQqdR.png

     

     

    위에서 Eternity를 잘 봐야 합니다. 이터니티는 Heroes와 Heroines에 둘다 있죠. 하지만, 결과에서는 한번만 표시되고 있습니다. 이렇게 SQL의 Union과 같이 합집합 연산 후 중복을 제거합니다. 사실 SQL의 Union은 Union Distinct와 같습니다. 다만 표현만 줄여서 사용하고 있는거죠. 그렇다면 합집합인 Union all은 어떻게 표현하는지 예제를 통해 확인 해보겠습니다.

    Program.cs

    using System;
    using System.Linq;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] heroes = { "Super Man", "Bat Man", "Spider Man", "Eternity" };
                string[] heroines = { "Wonder Woman", "Invisible Woman", "Cat Woman", "Eternity" };
                var meeting = heroes.Concat(heroines);
     
                foreach (var some in meeting)
                {
                    Console.WriteLine(some);
                }
     
                Console.ReadKey();
            }
        }
    }
    

     

     

    위 코드의 14라인처럼 Union 대신 Concat을 사용하면 합집합 연산이 수행됩니다. 이는 SQL의 Union All과 동일하게 동작됩니다. 아래 결과를 확인 해볼까요? 이터니티가 2번 등장하고 있네요.

    gwfiXC7.png

     

     

    2. Except (차집합)

    SQL의 EXCEPT와 동일한 결과를 반환합니다. A(Heroes) 테이블과 B(Heroines) 테이블이 있을 때 B테이블에 없는 A테이블의 고유한 값을 반환합니다.

    Program.cs

    using System;
    using System.Linq;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] heroes = { "Super Man", "Bat Man", "Spider Man", "Eternity" };
                string[] heroines = { "Wonder Woman", "Invisible Woman", "Cat Woman", "Eternity" };
                var meeting = heroes.Except(heroines);
     
                foreach (var some in meeting)
                {
                    Console.WriteLine(some);
                }
     
                Console.ReadKey();
            }
        }
    }

     

     

    결과를 보면 금방 이해할 수 있을겁니다. Heroes와 Heroines 전체에서 Heroes의 고유한 값만 반환됩니다.

    Jp81yux.png

     

     

    3. Intersect (교집합)

    두 집합이 모두 가지고 있는 항목을 반환합니다. 이 때 중복은 제거됩니다. 아래 예제에는 중복이 제거되는지 확인할 수 없습니다. 만약, 중복된 항목이 두 집합 모두에게 있다면 하나만 반환되는 것을 확인하려면 Heroes와 Heroines에 "Iternity"를 여러번 추가한 후 확인해도 됩니다.

    Program.cs

    using System;
     
    using System.Linq;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] heroes = { "Super Man", "Bat Man", "Spider Man", "Eternity" };
                string[] heroines = { "Wonder Woman", "Invisible Woman", "Cat Woman", "Eternity" };
                var meeting = heroes.Intersect(heroines);
     
                foreach (var some in meeting)
                {
                    Console.WriteLine(some);
                }
     
                Console.ReadKey();
            }
        }
    }
    

     

     

    결과를 보면, Eternity만 반환된 것을 확인할 수 있습니다.

    hafb6oD.png

     

     

    4. Distinct (중복 제거)

    데이타 행에서 중복을 제거할 때 사용됩니다. 간혹, GROUP BY를 이용하는 경우도 있는데 약간 용도가 다르다는 점을 분명히 해야 합니다. 이 둘은 외적으로 동일한 결과를 얻을 수 있지만, 성능상 차이가 존재하므로 가급적 Distinct를 사용하는게 좋겠습니다.

    Program.cs

    using System;
    using System.Linq;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] heroes = { "Super Man", "Bat Man", "Spider Man", "Eternity" };
                string[] heroines = { "Wonder Woman", "Invisible Woman", "Cat Woman", "Eternity" };
                var meeting = heroes.Concat(heroines).Distinct();
     
                foreach (var some in meeting)
                {
                    Console.WriteLine(some);
                }
     
                Console.ReadKey();
            }
        }
    }
    

     

     

    중복이 제거되었으므로 Eternity는 한번만 표시됩니다.

    q7pDDg0.png

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.