2015-02-02 15 views
1

사용자로 사용자 정의 컬렉션 IList<user>이 있습니다. 내가 users가 null 또는 비어 있는지 여부를 확인하려고 할 때, 내가 어떤 정보의 도움을받을하지 않았다 (IsNullOrEmpty 같은) 그래서 놀랍게도 아래의 확장 방법을 IEnumerable 대 Ilist - IsNullOrEmpty 확장 메서드

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source) 
    { 
     if (source.IsNullOrEmpty()) 
     { 
      return true; 
     } 
     return false; 
    } 

을 썼다, 나는 IEnumberable이 IsNullOrEmpty을 가지고() 발견했다. 내 지식 IList 당으로

다시, IEnumerable을 확장 그 경우라면 IListIsNullOrEmpty를 지원해야하는 ICollection 확장합니다.

내가 잘못한 부분을 수정하십시오.

+6

는'을 IEnumerable', 당신이 위에 쓴 확장'IsNullOrEmpty' 방법 않았습니다. –

+0

@TimSchmelter : D 감사합니다. –

+2

부수적으로 : 'IEnumerable '은 반복 가능하지 않아야합니다. 시퀀스가 비어 있는지 테스트하는 유일한 방법은 iterating을 시작하는 것입니다 : 반복을 시작하면 죽은, 완료되었거나, 끝났거나, 다시 볼 수 없게 될 수도 있습니다. –

답변

4

IEnumerable<T>IsNullOrEmpty 메서드가 아니며 위에서 작성한 확장 프로그램입니다. 전화를 걸면 StackOverflowException이됩니다.

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

을하지만이 방법은 매우 도움이되지 않습니다, 심지어 악화 향상시킬 수 있습니다하는 것이 중요합니다 :

이 방법으로 그것을 구현할 수 있습니다. Enumerable.Any은 쿼리를 "사용"하기 때문에 따라서 메모리 내 모음이 아닌 경우 GetEnumerator을 호출하고 열거하기 시작해야하므로 적어도 하나 이상의 항목이 있는지 확인하십시오. 때로는 객체가 열거 된 경우 (예 : File.ReadLines : .NET < = 4) 객체가 배치됩니다. 나중에 다시 사용하려고하면 ObjectDisposedException이 발생합니다.

이 방법이 원치 않는 부작용을 가지고있는 또 다른 예는 시퀀스가 ​​(...Where(x => Compute(x, random.Next())))을 필터링하는 쿼리 일 때입니다. 이 쿼리는 매번 다른 결과를 나타낼 수 있습니다. Marc Gravell의 의견을 인용하자면 : "IEnumerable은 반복 가능하다고 가정하면 안됩니다.".

Linq-To-SQL 또는 Linq-To-Entities에서는 IsNullOrEmpty 호출마다 데이터베이스를 호출합니다.

0

주석에서 언급 한 @Marc Gravel은 "IEnumerable<T>을 반복적이라고 가정해서는 안됩니다." 당신의 소스가 IEnumerable이 datareader로부터 생성된다고 가정하십시오. 당신은 한 번만 반복 할 수 있습니다. 비어 있는지 확인할 수있는 기회를 소비하는 경우 레코드에 다시 액세스 할 수 없습니다. 어쩌면 IList에 대한 확장 메소드 (필요한 경우)를 작성하고 IEnumerable 용으로 작성하지 않을 수도 있습니다. 당신이 그것을 호출하는 경우 당신이`StackOverflowException`를 얻을 수)

public static bool IsNullOrEmpty<T>(this IList<T> source) 
{ 
    return source == null || source.Count == 0; 
} 
+1

C#과 VB.NET이 열거 자에 무늬를 적용 할 수있는 "foreach"구조를 가지기를 바랍니다. 단지 GetEnumerator 메소드를 사용하여 물건을 받아 들일 수있는 것이 아닙니다. 한 번만 읽을 수있는 것은 열거 형이 아닌 열거 자이어야합니다. 그것은 언어로는 전자와 함께 일할 수 없어서 후자가되는 척해야합니다. – supercat