2017-04-11 16 views
7

私は遅延実行コードの一部を簡略化しましたが、try/catchでラップせずに次のコードがnull /空でないことをどのようにチェックしますか?列挙子から現在の項目は、あなたがそれを行うことはできませんC#で「遅延読み込み」のnull 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要素とともに呼び出されるため、NullReferenceExceptionがスローされます。 –

+0

@ RB。その難しい、私の上記の点のどれもが保持されません –

答えて

3

は、あなただけのヌルエントリへのあなたのラムダは、より弾力的にする必要がありこれは、メソッドが呼び出さずにNullReferenceExceptionをスローしないようにするにはどうすればよいのですか?他の手がかりを持たないのは、実際にそのようなメソッドを呼び出してその結果を観察することだけです。 IEnumerableを列挙すると、その列挙子に束のMoveNextが呼び出されています。そのような呼び出しは例外をスローする可能性があります。

+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()'を呼び出すと反復処理が行われ、 '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返すことができます。

関連する問題