2017-11-01 15 views
-2

辞書キーが存在するかどうかを確認するために、次のヘルパーがあります。これは、ように私は、キーが存在する場合、それは、リスト内の最初の項目を取得しないかどうかをチェックするリストと辞書を持っている場合、私はそれをリファクタリングするにはどうすればよいリファクタリング辞書ヘルパー

var myDictionary = new Dictionary<string, string>(); 
myDictionary.GetValue("FirstName"); 

public static TU GetValue<T, TU>(this Dictionary<T, TU> dict, T key) where TU : class 
{ 
    TU val; 
    dict.TryGetValue(key, out val); 
    return val; 
} 

文字列型の辞書のために正常に動作します例えば:

var myDictionary = new Dictionary<string, List<string>>(); 

//populate the dictionary... 

// Call to get first item from dictionary using key 
myDictionary.GetValue("FirstName")[0] 

私は次のようにカミソリでそれを使用したい:

<span >@myDictionary.GetValue("FirstName")[0]</span> 
+0

あなたがしたいと言っていることは既に*行います。 – Servy

+1

@Servyいいえキーが存在しない場合は値の型がリストであるため例外がスローされます – adam78

+1

キーが値を持っている場合、値がなければ何をしなければならないか、もう一度、あなたが提供したコードは、あなたがしなければならないと言ったことを正確に行います。 – Servy

答えて

1

エラーメッセージの理由についてのあなたの仮定間違っている:問題は、を戻ってきているということではありませんをGetValueから削除すると、キーが見つからないときにnull値をインデックス化しようとしているという問題があります。あなたの結果を確認する必要があり

がnullではない:元の関数は、より有用と思われる

<span>@(myDictionary.GetValue("FirstName") != null ? myDictionary.GetValue("FirstName")[0] : null)</span> 

その場合:

<span>@(myDictionary.TryGetValue("FirstName", out var val) ? val[0] : null)</span> 

あなたは空のコレクションを返すために、あなたの関数を修正することができるが、範囲外のエラーのインデックスを取得します。エラーなしで任意の値でインデックスを作成できるようにするための妥当な戻りオブジェクトはありません。あなたにもGetFirstValueとして本来の機能の名前を変更することができ

public static TU GetFirstValue<T, TU>(this Dictionary<T, IEnumerable<TU>> dict, T key) { 
    IEnumerable<TU> val; 
    dict.TryGetValue(key, out val); 

    return (val == null ? default(TU) : val.First()); 
} 

、および:そうでなければ、あなたは(私はここで入れて削除された参照)他の回答にあなたを導く、インデックス可能なタイプを処理するための第2の機能を作成する必要があります。コンパイラはどちらか適切なものを使用します。