상세 컨텐츠

본문 제목

LINQ

C#

by 탑~! 2018. 6. 29. 15:03

본문

배열이나 컬렉션에 들어간 요소를 순회하는 고전적인 방법중 하나는 foreach를 이용하는 것입니다.

 

List<Member> li = new List<Member{
    new Member { Name = "홍길동"Age = 40, BirthDay=DateTime.Parse("1978-01-28") },
    new Member { Name = "홍길순"Age = 21, BirthDay=DateTime.Parse("1997-05-16") },
    new Member { Name = "홍길남"Age = 38, BirthDay=DateTime.Parse("1980-03-06") },
    new Member { Name = "홍길영"Age = 19, BirthDay=DateTime.Parse("1999-11-20") },
    new Member { Name = "홍길석"Age = 27, BirthDay=DateTime.Parse("2003-08-04") }
};

foreach (Member m in li) {
    Console.WriteLine(m.Name);
}

 

이 상태에서 만약 나이가 20세 이상인 사람만을 추려내려면 if문을 추가할 수 있을 것입니다.

 

foreach (Member m in li) {
    if (m.Age > 20)
        Console.WriteLine(m.Name);
}

 

LINQ(Language Integrated Query)는 이러한 열거작업에 대한 확장구문으로서 SQL 쿼리와 비슷한 문법체계를 가지고 있습니다. 여기에서는 예제로 LIst형식의 컬렉션만을 다루고 있지만 컬렉션뿐만 아니라 XML이나 DB와의 연동에서도 LINQ가 사용되고 있습니다. 이렇게 다양한 곳에서 LINQ가 사용된다는 것은 LINQ문법만 익히면 일관된 방식으로 데이터를 쿼리할 수 있다는 것을 뜻합니다.

 

우선 간단하게 LINQ를 통해 전체를 열거하는 부분부터 살펴보겠습니다.

 

var ret = from Member in li
            select Member;

foreach (Member m in ret)
        Console.WriteLine(m.Name);

 

LINQ에서 select는 yield return과 같습니다. yield return은 IEnumerable<T>형식을 반환하므로 var ret는 IEnumerable<Member> ret로 바뀔 수 있습니다.

 

예제에서는 foreach에서 Name값을 가져오는데 이는 LINQ의 select에서도 처리될 수 있습니다.

 

var ret = from Member in li
            select Member.Name;

foreach (string m in ret)
        Console.WriteLine(m);

 

출력되는 값에 특정 포멧을 적용해야 한다면 select에서 익명타입을 구현하면 됩니다.

 

var ret = from Member in li
            select new { Name = Member.Name, BirthDay = Member.BirthDay.ToString("yyyy년MM월dd일") };

foreach (var m in ret)
        Console.WriteLine(m.Name + " : " + m.BirthDay);

 

LINQ에서 where를 이용하면 조건을 필터링할 수 있습니다.  여기에는 bool형식의 구문이 와야 합니다.

 

var ret = from Member in li
          where Member.Age > 20
          select Member;

foreach (var m in ret)
        Console.WriteLine(m.Name + " : " + m.BirthDay);

 

요소를 정렬하기 위해서는 orderby를 사용하며 IComparable 인터페이스가 구현된 타입이어야 합니다.

 

var ret = from Member in li
            orderby Member.Name descending
            select Member;

foreach (var m in ret)
        Console.WriteLine(m.Name);

 

orderby에서 descending는 내림차순, ascending는 오름차순입니다.

 

이외에도 서로 다른 컬렉션을 연결하는 join이나 특정 값으로 그룹핑하는 group by절등 다양한 구문이 존재하는데 여기서 몇몇 특징적인 기능의 경우에는 IEnumerable<T>의 확장메서드형태로 제공하는 것들이 있습니다.

 

예들 들면 select같은 경우

 

IEnumerable<Member> im = li.Select((em) => em);
foreach (Member m in im)
    Console.WriteLine(m.Name);

 

위와 같은 형태로 구현할 수 있도록 되어 있는데, 이러한 확장 메서드는 Select외에 Where나 OrderBy등 수십여가지의 메서드가 존재하니 필요할때 적절한 메서드를 사용하면 됩니다.



출처: http://lab.cliel.com/entry/C-LINQ?category=478966 [CLIEL LAB]

관련글 더보기