3

私はこのようなものを含むクラスを持っていてDictionary<int, Queue<string>> dict、それから私は使用しますTryGetValue

Queue<string> value;
if (!dict.TryGetValue(3, out value))
    throw new MyException("...");

基本的に入力の重複を避けるために、値の型を明示的に定義しないオプションはありますか?C ++ STLコンテナーには、value_typeそのような場合に使用できる値typedefがありますが、C#で同様の機能を見つけることができないようです。ありがとう。

4

4 に答える 4

2

優れたヘルパーメソッドを自分で定義する場合は、型の指定をまとめることができます。

public static class Utility
{
    public static TValue GetValueOrDefault<TKey,TValue>(
        this Dictionary<TKey, TValue> dictionary, 
        TKey key, 
        TValue @default = default(TValue))
    {
        TValue value;
        return dictionary.TryGetValue(key, out value)
                   ? value
                   : @default;
    }
}

ここでは、入力される値を明示的に入力する必要があることに注意してTryGetValueください。ただし、発信者からは次のように言うことができます。

var value = dict.GetValueOrDefault(3);    // implicitly typed
if (value == null)
    throw new MyException("...");

がこのコンテキストで有効な値である場合nullは、別のものが必要になりますが、同じ原則を適用できます。コンパイラがジェネリックメソッドの型を推測して、明示的な型を非表示にするヘルパーメソッドを構築できるという事実を利用してください。

于 2012-10-02T11:23:55.387 に答える
1

フラグメントを次のように書き直すことができます

if (!dict.ContainsKey(3))
    throw new MyException("...");
var value = dict[3];

または、恥知らずに盗まれ、AakashMの回答から改作された場合は、独自の拡張メソッドを記述して、TryGetValueパラメーターを入れ替えることができます。

public static V ValueGetTry<K, V>(this Dictionary<K, V> d, K k, out bool found)
{
    V v;
    found = d.TryGetValue(k, out v);
    return v;
}

と呼ばれる

bool found;
var val = dict.ValueGetTry(3, out found);
if (!found)
    throw new MyException("...");

これはすべての型引数に対して機能するはずであり、辞書を1回だけ照会します。

于 2012-10-02T11:15:06.313 に答える
1

いいえ。次のように、暗黙的に型指定された変数を使用ContainsKeyして辞書にインデックスを付けることができます。

var key = 3;
if (!dict.ContainsKey(key)) {
    throw new ...;
}

var value = dict[key];

もちろん、これは少し効率が悪くなります。varただし、で使用するオプションはありませんTryGetValue

于 2012-10-02T11:15:30.777 に答える
0

これは、インラインout変数を使用するC#7.0で可能になりました

if (!dict.TryGetValue(3, out var value))
    throw new MyException("...");

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7#out-variablesを参照してください

于 2019-10-29T12:20:08.483 に答える