본문 바로가기

c#

C# 문법 Linq 링큐 알아보기

C#에서 제공하는 기능 중 하나인 Linq는 데이터를 가공 하여 처리 할때 강력한 기능을 제공하는 문법입니다

배열형식이나 데이터형식들을 가공할때 쿼리처럼 사용 할 수있어 직관적이고 편리하게 사용 할 수 있는 문법이며 

필터링 매핑 정렬등의 기능들을 활용하여 데이터들을 보다 쉽게 가공할 수 있습니다.

 

아래 예제들은 linq의 활용 예제입니다.

 

1.기본 Linq형

string[] strArr = { "사과", "바나나", "포도" };

        /// <summary>
        /// 기본 linq형
        /// </summary>
        public void LinqTest()
        {
            var result = from ride in strArr
                         where ride == "사과"
                         select ride;

            foreach (var str in result)
            {
                MessageBox.Show(str.ToString());
            }
        }

위의 예제에서는 문자형식의 배열을 기본 링큐문법을 사용하여 "사과"인 데이터를 추출하는 로직입니다.

2.람다 활용 Linq

string[] strArr = { "사과", "바나나", "포도" };

public void LinqLamda()
        {
            var result = strArr.Where(p => p == "사과");

            foreach (var str in result)
            {
                MessageBox.Show(str.ToString());
            }
        }

위의 예제는 위의 기본형과 똑같은 기능을 수행하는 로직이지만 람다식을 활용하여 더욱 간편하게 조건을 걸고 데이터를 추출 할 수 있습니다. 링큐는 주로 람다식을 활용하여 간편하게 데이터를 추출하고 가공할 수 있습니다.

3.Order by Linq

string[] strArr = { "사과", "바나나", "포도" };

        public void LinqSort()
        {
            var sortStr = strArr.OrderBy(strArr => strArr);

            foreach (var str in sortStr)
            {
                MessageBox.Show(str.ToString());
            }
        }

링큐에서 제공하는 Orderby메서드는 쿼리에서 사용하는 order by 쿼리문 처럼 정렬할 때 사용할 수 있습니다.

Order by 에서 정렬 한뒤 linq에서 제공하는 thenby메서드를 통해 2차적으로 정렬 할 수 있습니다.

4.Select요소 변환

      public void LinqSelect()
        {
            //Select 메서드는 원하는 형식으로 변형 가능
            var strLength = strArr.Select(p => p + "배추");
            //.OrderBy(p=>p);

            foreach (var str in strLength)
            {
                MessageBox.Show(str.ToString());
            }
        }

select 메서드는 linq를 활용하여 가공할 데이터들을 원하는 형식으로 변형하여 출력 할 수 있습니다.  위처럼 strArr배열에 있는 데이터들 뒤에 문자를 붙여서 출력할때는 뒤에 있는 배추라는 문자가 함께 출력됩니다.

5.Join Linq

        public void LinqJoin()
        {
            string[] fruits = { "사과", "배" };


            var strJoin = strArr.Join(fruits,//조인할 시퀀스
                                      strArr => strArr, //시퀀스에서 조인 할 키 추출
                                      fruits => fruits, //참조된 시퀀스에서 조인 할 키 추출
                                      (strArr, fruits) => strArr);//두개의 시퀀스를 매개변수로하여 선택된 배열에 있는 요소 추출

            foreach (var str in strJoin)
            {
                MessageBox.Show(str.ToString());
            }
        }

join메서드는 쿼리에서 join을 하듯이 시퀀스들의 키값을 매핑하여 원하는 데이터를 추출할 때 사용합니다. 위의 예제에서는 단순 문자형식의 배열이여서 람다식을 사용해 파라미터를 지정하였으나 만약 property가 있는 Entity객체였다면 키값을 따로 지정하면 됩니다.

6.Group by Linq

        public void LinqGroup()
        {
            List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };

            var evenOddGroup = list.GroupBy(p => p % 2 == 0 ? "EVEN" : "ODD");

            foreach (var group in evenOddGroup)
            {
                //string.Join 을 사용하여 문자배열의 요소들을 결합
                MessageBox.Show(group.Key + " 갯수:" + group.Count() + " 요소:" + string.Join(", ", group));
            }
        }

groupby메서드는 같은 키값로 요소들을 구분하여 출력 할 수 있는 기능이며 위의 예제에서 group의 속성에는 key라는 속성이 있어 해당 키값을 출력할 수 있으고 배열의 형태를 가져 각각의 요소들을 추출할때는 위의 예제에서 반복문을 한번 더 사용하면 각각의 요소를 추출 할 수 있습니다.