2017-04-11 3 views
7

지연된 실행 코드를 단순화했습니다. 그러나 try/catch에서 랩핑하지 않고 다음 코드가 null/empty가 아닌지 확인하는 방법은 무엇입니까? 열거에서 현재 항목 당신은 그렇게 할 수 없습니다'지연로드'NULL 테스트 C#에서 IEnumerable?

string[] nullCollection = null; 
IEnumerable<string> ienumerable = new[] { nullCollection }.SelectMany(a => a); 

bool isnull = ienumerable.GetEnumerator().Current == null; 
if (!isnull) 
{ 
    bool isany = ienumerable.Any(); 
} 
+0

@MrinalKamboj SelectManyIterator가 null 요소와 함께 호출되기 때문에 Throw되는 NullReferenceException입니다. –

+0

@RB. 그 까다로운, 내 위의 포인트 중 아무도 보유하지 않습니다 –

답변

3

당신은 null 항목에 대한 귀하의 람다 탄력해야 왜냐하면 "메서드가 호출하지 않고 NullReferenceException을 던지지 않을 것이라고 어떻게 말할 수 있습니까?"라는 질문과 동일하기 때문입니다. 다른 단서가없는 유일한 방법은 실제로 그러한 메소드를 호출하고 그 결과를 관찰하는 것입니다. IEnumerable을 열거하면 열거자인 MoveNext이라는 호출이 호출되며 이러한 호출은 예외를 throw 할 수 있습니다.

+0

이것은 좋은 일이지만, 그냥 IEnumerable 인수가 전달 된 경우 나는 내가 갇혀있는 것 같아요 ... – maxp

+0

@maxp 예 - 근본적인 문제가 있습니다 'ienumerable'의 건설과 함께. 어떤 문제가 있다고 생각하지 않습니다. –

2

당신은 확인할 수 있습니다

string[] nullCollection = null; 
    IEnumerable<string> ienumerable = new[] { nullCollection }.SelectMany(a => a); 

    bool isnull = ienumerable == null; //returns false 
    bool isany = ienumerable.Any(); //throws an exception 
+1

이것은 작동하지 않을 것입니다.'MoveNext()'를 호출하여 iterate를 호출하면'null' 요소를 만나면 충돌이 발생합니다. 궁극적으로 프로젝션 함수는 각 요소에 대해 평가 될 것이고 null 값으로 호출 될 때 충돌을 일으킬 것입니다. 나는 주위를 둘러 볼 것이 없다고 생각합니다. –

+2

@ RB. W/o'MoveNext()','Current'가 없습니다 :). 원점으로 되돌아갑니다. –

+3

이것은 매우 잘못된 대답입니다. MoveNext가 정의되지 않은 동작을하기 전에'Current'에 액세스합니다. 대개 'null'을 반환합니다. –

3

null의 경우

IEnumerable<string> ienumerable = new[] { nullCollection } 
    .SelectMany(a => a ?? Enumerable.Empty<string>()); 

bool isany = ienumerable.Any(); // Sets isany to 'false' 
0

Linq 메서드는 IEnumerable의 확장 메서드이기 때문에 확장 메서드를 사용하면 이러한 확장 프로그램을 추가로 래핑 할 수 있습니다. 확장 메서드를 사용하면 해당 개체가 null 일 수 있습니다.

public static IEnumerable<TResult> SafeSelectMany<T, TCollection, TResult>(
      this IEnumerable<T> source, 
      Func<T, IEnumerable<TCollection>> collectionSelector, 
      Func<T, TCollection, TResult> resultSelector) 
    { 
     if (source == null) 
     { 
      return null; 
     } 
     IEnumerable<TResult> result = source.SelectMany(collectionSelector, resultSelector); 
     return result; 
    } 

또한 source==null에 대해 빈 List<TResult> 대신 null 반환 할 수 있습니다.