나는 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