출처 : Differences Between Any and Exists Methods in C# - Code Maze (code-maze.com)
두 함수는 비슷해보이지만, 각자 고유의 특성이 있다.
Any Method
LINQ Any() 함수는 collection의 어떤 element가 주어진 조건을 만족하거나 존재하는지 결정하도록 한다. collection의 elements를 하나하나씩 확인하며, result가 결정될 때마다 boolean value를 반환한다. IEnumerable<T> interface를 구현하는 모든 collections(Arrays, Lists, Dictionaries)와 함께 사용할 수 있다.
collections이 null이면 ArgumentNullException 에러를 던진다.
Any() 함수의 2 overloads가 있다.
1. 추가 parameters가 없고, source가 empty 인지 아닌지만 확인한다.
public static bool Any<TSource> (this IEnumerable<TSource> source);
2. generic delegate를 parameter로 받는다. collection이 empty한지 그리고 적어도 하나의 element가 주어진 조건을 만족하는지 확인한다.
public static bool Any<TSource> (this IEnumerable<TSource> source, Func<TSource,bool> predicate);
이제 실제 코드에서 어떻게 사용되는지 알아보자.
public static class NumbersHelper
{
public static bool CheckIfArrayIsEmpty(int[] numbers)
=> !numbers.Any();
public static bool CheckIfListContainsPositiveNumbersAny(List<int> numbers)
=> numbers.Any(x => x > 0);
}
NumbersHelper class는 integers의 collection을 query하는 2개의 함수를 포함한다. CheckIfArrayIsEmpty() 함수는 array가 empty한지 확인한다. CheckIfListContainsPositiveNumbersAny() 함수는 x => x > 0 lambda expression을 사용해서 positive number를 포함하는지 확인한다.
Exists Method
Exists 함수는 collection이 specified predicate에 의해 지정된 조건에 맞는 elements를 포함하는지 결정한다. 결정되면 search는 중지하고, 해당하는 boolean 값을 반환한다. 두 함수의 가장 큰 차이는 Exists() 함수는 List<T> collections에만 사용할 수 있다는 것이다.
Any()와 유사하게, null collections에 대해 ArgumentNullException을 던진다.
predicate delegate를 argument로 갖는 하나의 overload를 갖는다.
public bool Exists (Predicate<T> match);
실제 코드에서는 다음과 같이 사용된다.
public static class NumbersHelper
{
public static bool CheckIfListContainsPositiveNumbersExists(List<int> numbers)
=> numbers.Exists(x => x > 0);
}
Any와 Exists 함수 차이점
Any | Exists |
LINQ, .NET 3.5 | System.Collections.Generic, .NET Framework 2.0 |
IEnumerable interface를 구현하는 collection에 사용 | List collections에 사용 |
lambda expressions, LINQ와 사용 | predicate delegate with lambda |
collection empty한지 확인 가능 | collection empty한지 확인 불가능 |
조건 만족하는 elements를 collection이 포함하는지 확인 가능 | 조건 만족하는 elements를 List가 포함하는지 확인 가능 |
결과 결정되면 멈춤 | 결과 결정되면 멈춤 |
Lists와 performance 떨어짐 | Lists와 performance 좋음 |
Any와 Exists 중 어느 것은 선택할 것인가
Any()는 IEnumerable interface를 구현하는 모든 collection에 사용 가능하고, 조건 만족 뿐 아니라 collection 자체의 emptiness도 확인 가능하다.
반면에 Exists는 List collection에서만 사용 가능하고, 더 나은 performance를 제공한다.
'C#' 카테고리의 다른 글
C#] Path의 File, Directory 여부 확인 (0) | 2024.01.05 |
---|---|
C#] System.Linq.Enumerable.Aggregate 함수 (0) | 2023.11.15 |
C#] Discard Variable '_' 사용법 (0) | 2023.11.14 |
C#] Query String 만드는 방법 (0) | 2023.11.07 |
C#] String 검색 함수, 성능 비교 (0) | 2023.10.23 |
댓글