2017-06-19 1 views
0

私は非常に奇妙な問題に直面していますが、どこに問題があるのか​​わかりません。私がコード内を歩き、すべてのシナリオを分析すると、私は を参照しても、それはArgumentNullExceptionを介して行うことができます。IList.Distinctメソッドが、指定されたシナリオでArgumentNullExceptionをスローする方法

しかし、何とか本番サーバーでは、次の例外スロー:

例外の詳細:System.ArgumentNullException:値をnullにすることはできませんが。 パラメータ名:System.Linq.Enumerable.ToList [TSOURCE(IEnumerable`1源)のソース
Iサンプル・コンソール・アプリケーションのコードを抽出したGetDistinctValues(IList`1 textNames)


。 GetDistinctValuesメソッドがこのArgumentNullExceptionをスローする可能性があるシナリオを教えてもらえますか?

サンプルコードスニペット:public static List<T> ToList<T>(this IEnumerable<T> source)

private IList<string> GetDistinctValues(IList<string> textNames) 
{ 
    var values = GetTextValues(textNames); 
    var trimmedValues = values.Select(value => value.Trim()); 
    return trimmedValues.Distinct(StringComparer.InvariantCultureIgnoreCase).ToList(); 
} 

public static IList<string> GetTextValues(IList<string> textNames) 
{ 
    var values = new List<string>(); 
    var names = (List<string>)textNames; 
    if (!names.Any()) 
    { 
     return null; 
    } 

    names.ForEach(x => values.Add(GetValue(x))); 

    return values; 
} 

private static string GetValue(string name) 
{ 
    // returns some value depending on name 

    return "someValue"; 
} 
+10

'if(!names.Any()) { を返します。 } 'GetTextValues'は候補のように見えます – stuartd

+1

'!names.Any() 'は潜在的な原因です。' names'がnullの場合は失敗します。 –

+0

例外が表示されます - System.Linq.Enumerable .ToList [TSource](IEnumerable'1ソース)。私はToList()に変換すると、この例外を生成することができますtrimmedValues.Distinct(StringComparer.InvariantCultureIgnoreCase).ToList();を返すことができますか? – App

答えて

0

ToListは、おそらくこのような署名付きの拡張方法、です。例外を読み取ると、sourceはnullです。 Ergo、GetTextValuesはnullを返します。 namesが存在しないときに実行します。

0

コレクションをLINQで使用する場合は、 を絶対に使用しないでください。今まで!返すものがない場合はを返します。代わりに、Enumerable.Emptyまたは空のコレクションを返す必要があります。関数が返す要素がないと判断した場合は、列挙子を返します。この場合、要素を列挙していない列挙子が返されます。

あなたの機能を変更することを検討:

public static IEnumerable<string> GetTextValues(IEnumerable<string> textNames) 
{ 
    if (textNames == null) 
     return Enumerable.Empty<string>(); 
     // or consider: throw ArgumentNullException(nameof(textNames)); 
    return textNames.Select(textName => GetValue(textName)); 
} 

リストの代わりに列挙を返すのいいところは、あなたの関数のユーザーが、あなたのリストの最初のいくつかの要素が必要な場合は、わずか数の要素が作成されていることです。

関連する問題