세 가지 일반적인 LINQ 실수 및 해결 방법

LINQ는 컬렉션을 사용하는 선언적이고 지연 평가 방식입니다. for , foreach 및 기타 루프를 대체하기 위해 LINQ 작업을 시작하는 것은 그렇게 복잡하지 않습니다. 그러나 LINQ로 작업할 때 자주 저지르는 실수가 있습니다. LINQ를 처음 접할 때 흔히 저지르는 세 가지 실수와 해결 방법을 알아보겠습니다.

실수 1: Any 대신 Count를 사용하세요.



컬렉션에 요소가 있는지 또는 조건을 충족하는 요소가 하나 이상 있는지 확인하려면 항상 Any보다 Count를 선호해야 합니다.

글을 쓰자,

movies.Any()

대신에,

movies.Count() > 0
Any 메서드는 하나 이상의 요소를 찾으면 반환하지만 Count 메서드는 전체 쿼리를 평가합니다. 이는 대규모 컬렉션의 경우 성능 저하가 될 수 있습니다.

실수 2: Where 다음에 Any를 사용하세요.



먼저 Any로 필터링한 다음 Where를 사용하는 대신 Any로 조건을 직접 사용할 수 있습니다.

글을 쓰자,

movies.Any(movie => movie.Rating == 5)

대신에,

movies.Where(movie => movie.Rating == 5).Any()
Where 메서드 다음에 FirstOrDefault , Count 또는 필터 조건을 받는 다른 메서드에도 동일하게 적용됩니다. 먼저 Where 메서드에 의존하는 대신 필터 조건을 직접 사용할 수 있습니다.

실수 3: null 검사 없이 FirstOrDefault 사용


FirstOrDefault , LastOrDefaultSingleOrDefault 로 작업할 때 결과가 있는지 항상 확인합시다.

위의 세 가지 방법 중 하나라도 결과를 찾지 못하면 컬렉션 유형의 기본값을 반환합니다.

개체의 경우 기본값은 null 참조입니다. 그리고 null 참조에서 속성이나 메서드에 액세스할 때 어떤 일이 발생하는지 아십니까?... 예, 무시무시한 NullReferenceException 가 발생합니다. 아아악!

다음 코드 샘플에 이 실수가 있습니다. worst 변수에 값이 있는지 확인하는 것을 잊었습니다. Anif (worst != null)이 문제를 해결할 것입니다.

var movies = new List<Movie>
{
    new Movie("Titanic", 1998, 4.5f),
    new Movie("The Fifth Element", 1995, 4.6f),
    new Movie("Terminator 2", 1999, 4.7f),
    new Movie("Avatar", 2010, 5),
    new Movie("Platoon", 1986, 4),
    new Movie("My Neighbor Totoro", 1988, 5)
};

var worst = movies.FirstOrDefault(movie => movie.Rating < 2);

// We forgot to check for nulls after using FirstOrDefault
// It will break    
Console.WriteLine($"{worst.Name}: [{worst.Rating}]");
//                  ^^^^^^^^^^^^ 
// System.NullReferenceException: 'Object reference not set to an instance of an object.'
//
// worst was null.

Console.ReadKey();

record Movie(string Name, int ReleaseYear, float Rating);

등급이 2보다 낮은 첫 번째 영화를 찾기 위해 FirstOrDefault를 사용하여 LINQ 쿼리를 작성했습니다. 하지만 해당 조건과 일치하는 영화가 없습니다. FirstOrDefault 메서드는 null를 반환했으며 worst 변수가 null와 다른지 확인하는 것을 잊고 사용했습니다.

.NET 6에서 선택한 nullable reference types from C# 8.0, the DefaultOrEmpty method 또는 FirstOrDefault with an optional default value과 같은 NullReferenceException를 제거하는 다른 대안이 있습니다.

짜잔! 이것이 가장 일반적인 세 ​​가지 LINQ 실수입니다. 나는 그들이 어리석은 것처럼 보인다는 것을 알고 있지만 우리는 종종 그들을 간과합니다. LINQ 및 모든 기능을 자세히 살펴보려면 myQuick Guide to LINQ 를 확인하십시오.





여기요! 저는 소프트웨어 엔지니어이자 평생 학습자인 Cesar입니다. 내 작업에 대해 자세히 알아보려면 my blog을 방문하세요! 내 작업을 지원하려면 Educative에서 내Getting Started with LINQ course를 확인하십시오.

즐거운 코딩하세요!

좋은 웹페이지 즐겨찾기