[C#/LINQ] MoreLINQ, LINQ를 확실히 활용하고싶다면 반드시 필요한 패키지!

LINQ?

다들 아시겠지만, .NET 프레임워크에는 LINQ라는 아주 뛰어난 기능이 잘 구현돼 있습니다. 이 링크를 보시면 이에 대한 내용이 잘 정리돼 있으니 LINQ가 뭔지 모르시는 분이 계신다면, 한 번 보시는 것을 추천합니다.
아무튼, 요점은 이게 아닙니다. LINQ에 대한 개념이 없으신 분일지라도, C# 코딩을 하다가 한 번쯤은 List<T>를 사용해봤을 것이고, 무조건 IEnumerable<T>에 대한 접근을 해야만 했던 경우가 있었을 것입니다. 예를 들어 아래와 같이요.
var listPeople = new List<People>
{
    new People("이정민", "960528"),
    new People("염정실", "600709"),
};
위의 예제는 List<T>의 사용 예입니다. 클래스명에서 알 수 있듯, 여러 타입에 대한 리스트를 만들고 관리하는 데 사용됩니다. 저는 지금 리스트 안에 두 개의 객체만 예시로 넣어놨으나, 거대한 데이터베이스에 수십만 개의 People 데이터가 쌓여있고, 그것을 가져와서 처리한다고 생각해보세요.
말로만 해서는 이해가 힘들 수도 있겠습니다. 그럼 한 번 그 수십만 개의 People 객체를 담고 있는 List<People> 객체에서 성씨가 씨인 사람만 뽑도록 해볼까요?
var listPeopleStartsWithLee = listPeople.Where(_ => _.Name.StartsWith("이"));

// 또는

var listPeopleStartsWithLee = from person in listPeople where person.Name.StartsWith("이") select person;
자. 이게 바로 LINQ입니다. 마치 DB에 쿼리를 날리는 것처럼 보이죠? 맞습니다. 그런 식으로 유연하게 대응할 수 있도록 만들어진 게 LINQ이거든요.
여기서 listPeopleStartsWithLee의 타입은 IEnumerable<People>이 되는데, 이대로 여러 번 재사용하면 여러 번 계산되기에 ToList()를 써서 리스트로 변환하고 해야 할 때가 있고 아닐 때가 있다는 얘기는 다음에 기회가 되면 하도록 하겠습니다. 아마 1년 반 뒤가 되지 않을까 싶네요. 군대에 11월 5일 입대하거든요.
아무튼, 이게 바로 LINQ입니다. 오늘 이 글에서 소개할 MoreLINQ 라이브러리는 이 LINQ를 더 효율적으로 사용할 수 있게 해주는 라이브러리입니다.

MoreLINQ, LINQ를 더욱더 유연하게 사용하자

LINQ는 그 자체로 강력합니다. 그러나, C#에는 기본적으로 구현돼있지 않은 기능은 직접 구현해서 써야 한다는 한계가 있습니다. 예를 들어, List<int>에 수십만 개의 데이터가 있고, 이 데이터를 한 번 섞어야 한다고 생각해보세요. 직접 구현한다면 대략 아래와 같은 코드가 될 것입니다.
private static Random _rnd = new Random();  

public static void Shuffle<T>(this IList<T> list)  
{  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = _rnd.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

// 사용
listData.Shuffle();
물론, 얼마든지 이렇게 만들어 쓸 수 있고, 또 이런 식으로 모여진 기능들을 자신만의 라이브러리로 만들어 사용할 수도 있겠죠.
하지만! 이미 누군가가 만들어놓은 검증된 안정적인 라이브러리가 무료로 공개돼 돌아다니고 있다면 굳이 그럴 필요가 있을까요?
따라서 소개합니다. LINQ를 더 유연하게! MoreLINQ 라이브러리입니다!
Acquire, Aggregate, Append, Assert, AtLeast, AtMost, Sum, Shuffle, Skip, SkipUntil, Take, TakeUntil, ToDictionary, ToHashSet, … 당장 기억나는 유용한 확장만 나열해도 이 정도입니다. 제가 위에 예시로 든 Shuffle<T>도 역시 포함돼 있습니다. 당장 코딩하다가 어떤 LINQ관련 기능이 필요할 때, 해당 기능을 영어로 떠올리고 IntelliSense에 기대보세요. 매우 높은 확률로 이미 구현돼있을 겁니다.

MoreLINQ 설치

NuGet 패키지 매니저에 Install-Package morelinq를 쳐도 되고, NuGet 패키지 매니저(UI)에 morelinq라고 검색하면 작성자 MoreLINQ Developers.로 최상위에 위치해 있습니다.

댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭

테일즈위버 OST 전곡 모음