.NET에서 IEnumerable이 비어 있는지 확인하기 위한 견고하고 우아하며 재사용 가능한 코드 조각은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/117355

  •  02-07-2019
  •  | 
  •  

문제

저는 IEnumerable인지 여부를 결정하는 데 사용할 수 있는 가장 재사용 가능하면서도 우아한 코드 조각을 찾으려고 노력하고 있습니다.이상적으로 이것은 IEnumerable이 비어 있는지 확인해야 할 때 언제든지 호출할 수 있는 함수여야 합니다.

지금까지 나에게 잘 맞는 .NET 3.5에 대한 답을 개발했지만, 현재 내 생각에는 완벽한 답은 없다는 것입니다. 왜냐하면 IEnumerable은 기본 결과를 다음과 같이 수정하는 컬렉션(또는 반복기 큐)을 기술적으로 캡슐화할 수 있기 때문입니다. 반복되어 문제가 발생할 수 있습니다.그러나 이는 IEnumerable.Count() 구현에 장애가 될 수도 있으며 MS가 IEnumerable.Count()를 제공하는 것을 막지는 못했습니다.

그래서 나는 누군가가 더 나은 것을 가지고 있는지 확인하고 다른 누군가가 그것이 유용하다고 생각할 경우를 대비하여 SO에 넣을 것이라고 생각했습니다.

편집하다: 와, 제가 IEnumerable.Any에 대해 몰랐다니 믿을 수가 없네요.나는 그것이 존재한다는 것을 알고 있었지만 그것이 무엇인지 확인하려고 애쓰지 않았습니다.이것을 교훈으로 삼으십시오.설명서를 읽어보세요.메서드 이름이 원하는 작업을 수행함을 의미하지 않는다고 해서 원하는 작업을 수행하지 않는다는 의미는 아닙니다.

도움이 되었습니까?

해결책

!enumerable.Any()

첫 번째 요소만 가져오려고 시도합니다.

이것이 작동하는 방법/이유를 확장하기 위해 any는 IEnumerable 주어진 함수와 일치하고, 아무 것도 주어지지 않으면 모든 구성 요소가 성공합니다. 즉, 요소가 열거 가능 항목에 있으면 함수는 true를 반환합니다.

다른 팁

.net 1/2의 경우:

IEnumerator e;
try
{
   e = enumerable.GetEnumerator();
   return e.MoveNext();
}
finally
{ 
    if (e is IDisposable)
        e.Dispose();
}

또는 제네릭의 경우:

using (IEnumerator<T> e = enumerable.GetEnumerator())
{
    return e.MoveNext();
}

완벽한 답은 없다는 말씀이 맞습니다.IEnumerable은 반복만 지원하며 열거가 반복 가능하다는 것을 보장하지 않습니다.MoveNext를 한 번 이상 호출하지 않으면 열거에 요소가 포함되어 있는지 확인할 수 없으며 일단 호출한 후에는 열거를 재사용할 수 있다고 보장할 수 없습니다.IEnumerable.Reset에서 NotSupportedException을 발생시키는 것이 허용됩니다.에서 http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.reset.aspx:

"COM 상호 운용성을 위해 Reset 메서드가 제공됩니다.반드시 구현할 필요는 없습니다.대신 구현자는 단순히 NotSupportedException을 발생시킬 수 있습니다."

IEnumerable<T>.Count 및 IEnumerable<T>.Any와 같은 확장 메서드는 내부적으로 MoveNext를 호출해야 합니다.유용한 래퍼이지만 열거형이 Reset을 지원하지 않는 (드물게) 경우에 문제가 발생할 수 있다는 사실을 피하지 마십시오.

이러한 방법 중 하나에서 주의해야 할 점은 모든 열거형을 롤백할 수는 없다는 것입니다. 예를 들어 System.Data.IDataReader의 모든 구현은 한 번만 실행할 수 있습니다.

이 경우에는 실제로 비용이 들지 않습니다. foreach 한 번도 반복되지 않을 수 있다는 사실을 고려하는 한 반복하십시오.

첫 번째 방법은 빈 확장 방법을 간단하게 구현한 것입니다.http://signum.codeplex.com/SourceControl/changeset/view/25903#510468

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top