[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.로 최상위에 위치해 있습니다.
댓글
댓글 쓰기