nullをチェックしようとしましたが、コンパイラーはこの状態が発生しないことを警告しています。何を探すべきですか?
nullをチェックしようとしましたが、コンパイラーはこの状態が発生しないことを警告しています。何を探すべきですか?
回答:
キーが存在する場合に値を取得する場合は、次を使用しますDictionary<TKey, TValue>.TryGetValue
。
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(ContainsKey
インデクサーを使用してから、キーを2回調べます。これはかなり無意味です。)
参照型を使用している場合でも、nullのチェックは機能しません。nullをDictionary<,>
返すのではなく、不足しているキーを要求すると、インデクサーは例外をスローします。(これは大きな違いであるDictionary<,>
とHashtable
。)
ContainsKey
値よりも抽出しなければならないため、それは真よりも多くの仕事をしていると言います。ただし、2つのルックアップは行いません。
辞書にKeyNotFound
キーが含まれていない場合、辞書は例外をスローします。
提案されているようにContainsKey
、適切な予防策です。 TryGetValue
も効果的です。
これにより、ディクショナリはnullの値をより効果的に格納できます。このように動作しない場合、[]演算子からのnull結果をチェックすると、null値か、入力キーが存在しないために問題があります。
新しい値を追加する前に確認するだけの場合は、次のContainsKey
メソッドを使用します。
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
値が存在することを確認する場合TryGetValue
は、Jon Skeetの回答に記載されている方法を使用します。
GetValueElseAdd
、値(またはFunc<TValue>
)を指定してInsertの解像度を保存するメソッドもあり、そこに追加しない場合は追加します。.NETライブラリに組み込まれなかった理由は、キャッシュスタイルで追加パスを使用すると、追加パスの頻度が低くなるためです]
TryGetValue
より良いでしょうが、重複した追加を避けるためにディクショナリにキーが含まれているかどうかを確認したい場合、私ContainsKey
は同じように良いと思います(良くない場合)。
値を取得する前に、Dictionary.ContainsKey(int key)を確認する必要があります。
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
TryGetValue
。ありがたいことに、私は今、そうしているので、将来知っています。この回答はそのままにしておきますが、 'cosの議論は価値があります。
TryGetValue
では、ラムダ式では使用できませんでした。それでも、C#の新しい拡張機能catch
は、null
合体演算子に似た演算子になると思います。
ヘルパークラスは便利です。
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKeyは、探しているものです。
あなたはおそらく使うべきです:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
nullを確認できないのは、ここのキーが値型であるためです。
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
キーがディクショナリに存在する場合は、キーの値を返し、それ以外の場合は0を返します。
このコードがお役に立てば幸いです。
TryGetValue
使用してくださいvalue
result
この特定の辞書をカプセル化するオプションを検討し、そのキーの値を返すメソッドを提供します。
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
その後、この辞書の動作を管理できます。
たとえば、次の例のように、辞書にキーがない場合は、パラメータで渡したキーを返します。