[C#] IEnumerable이 null인지 또는 비어 있는지 확인하는 방법은 무엇입니까?

나는 string.IsNullOrEmpty방법을 좋아한다 . IEnumerable에 대해 동일한 기능을 허용하는 것을 갖고 싶습니다. 그런가요? 어쩌면 컬렉션 도우미 클래스일까요? 내가 묻는 이유는 if성명서에서 후두둑이 인 경우 코드가 복잡해 보이기 때문입니다 (mylist != null && mylist.Any()). 갖는 것이 훨씬 더 깨끗합니다 Foo.IsAny(myList).

이 게시물은 그 대답을 제공하지 않습니다 : IEnumerable이 비어 있습니까? .



답변

확실히 당신 그것을 쓸 수 있습니다 :

public static class Utils {
    public static bool IsAny<T>(this IEnumerable<T> data) {
        return data != null && data.Any();
    }
}

그러나 모든 서열이 반복 가능한 것은 아님을주의해야한다. 일반적으로 나는 만일을 위해 그들을 한 번만 걷는 것을 선호합니다.


답변

public static bool IsNullOrEmpty<T>(this IEnumerable<T> enumerable) {
    return enumerable == null || !enumerable.Any();
}


답변

다음은 정적 래퍼 클래스를 포함하는 @Matt Greer의 유용한 답변의 수정 된 버전입니다.이를 복사하여 새 소스 파일에 붙여 넣을 수 있으며 Linq에 의존하지 않고 일반적인 IEnumerable<T>오버로드를 추가하여 값 유형의 권투를 피할 수 있습니다 제네릭이 아닌 버전에서 발생합니다. [편집 : 참고를 사용한다고 IEnumerable<T>해서 열거 자의 복싱을 막을 수는 없으며 , 오리 타이핑으로이를 막을 수는 없지만 최소한 값 유형 컬렉션의 요소는 각각 복싱되지는 않습니다.]

using System.Collections;
using System.Collections.Generic;

public static class IsNullOrEmptyExtension
{
    public static bool IsNullOrEmpty(this IEnumerable source)
    {
        if (source != null)
        {
            foreach (object obj in source)
            {
                return false;
            }
        }
        return true;
    }

    public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
    {
        if (source != null)
        {
            foreach (T obj in source)
            {
                return false;
            }
        }
        return true;
    }
}


답변

또 다른 방법은 열거자를 가져와 MoveNext () 메서드를 호출하여 항목이 있는지 확인하는 것입니다.

if (mylist != null && mylist.GetEnumerator().MoveNext())
{
    // The list is not null or empty
}

이것은 IEnumerable 및 IEnumerable <T>에서도 작동합니다.


답변

최신 C # 기능을 활용하여 내가하는 방식 :

옵션 1)

public static class Utils {
    public static bool IsNullOrEmpty<T>(this IEnumerable<T> list) {
        return !(list?.Any() ?? false);
    }
}

옵션 2)

public static class Utils {
    public static bool IsNullOrEmpty<T>(this IEnumerable<T> list) {
        return !(list?.Any()).GetValueOrDefault();
    }
}

그리고 컬렉션이 비어 있는지 확인 Count == 0하거나 Count() == 0확인 하지 마십시오 . 항상 Linq를 사용하십시오.Any()


답변

도움이 될 수 있습니다

public static bool IsAny<T>(this IEnumerable<T> enumerable)
{
    return enumerable?.Any() == true;
}

public static bool IsNullOrEmpty<T>(this IEnumerable<T> enumerable)
{
    return enumerable?.Any() != true;
}


답변

C # 6부터는 null 전파를 사용할 수 있습니다 .myList?.Any() == true

그래도 너무 애매하거나 확장 방법을 선호한다면 Matt Greer와 Marc Gravell의 답변을 추천하지만 완벽 함을 위해 약간의 확장 기능이 있습니다.

그들의 답변은 동일한 기본 기능을 제공하지만 각각 다른 관점에서 볼 수 있습니다. Matt의 대답은- string.IsNullOrEmpty정직성을 사용하는 반면 Marc의 대답은 Linq의 .Any()길을 따라 작업을 완료합니다.

개인적으로 .Any()도로 를 사용하는 경향이 있지만 방법의 다른 과부하 에서 상태 확인 기능을 추가하고 싶습니다 .

    public static bool AnyNotNull<T>(this IEnumerable<T> source, Func<T, bool> predicate = null)
    {
        if (source == null) return false;
        return predicate == null
            ? source.Any()
            : source.Any(predicate);
    }

따라서 여전히 다음과 같은 일
myList.AnyNotNull(item=>item.AnswerToLife == 42);을 할 수 .Any()있습니다.

C # 6 방법 을 사용 하면 null 대신 전파 하는 실제 효과 인 myList?.Any()a bool?대신을 반환합니다.bool