2

ディクショナリをパラメータとしてメソッドに送信しようとしています。動作しますが、少し面倒になります。私はそれを何百万回もやっています、そして私はそれを可能な限り少し滑らかにしたいと思います。今のところ、これはどのように見えるかです:

MyMethod(new Dictionary<string, object> { { string1, value1 }, { string2, value2 } });

私はそれをもっとこのように見せたいです:

MyMethod({ string1, value1 }, { string2, value2 });

これは夢の裏切りですか?それを行う方法について何かアイデアはありますか?

4

4 に答える 4

4

探している構文のタイプを取得する方法はないと思います。私が考えることができる最も近い、そして最も短いことは、次のようなものを定義することです:

using D = System.Collections.Generic.Dictionary<string, object>;

そして、次のことができます:

MyMethod(new D {{string1, value1},{string2, value2}});

これは少し短いですが、おそらくまだ理想的ではありません。

于 2012-08-23T20:24:41.323 に答える
2

それはほとんど夢物語です。ジェネリックメソッドを含む非ジェネリッククラスでジェネリッククラスを作成できるため、次のように記述できます。DictionaryBuilderDictionaryBuilder.Start

MyMethod(DictionaryBuilder.Start(string1, value1).Add(string2, value2).Build());

...しかし、それもまったくいいことではありません。

(組み込み初期化子ではなく) 新しいオブジェクトにコレクション初期化子を使用するには、コンストラクターを呼び出す必要があります。これは、型引数を指定することを意味します。

于 2012-08-23T20:20:51.273 に答える
2

あなたが探していることを正確に行う方法は私にはわかりませんが、少しごまかして、可変引数リストを使用することはできます。型チェックがいくらか失われ、正確に正しく呼び出さないと例外が発生しますが、冗長ではありません。

void MyMethod( params object[] arr ) {
    var d = new Dictionary<string,object>();
    for( int i=0; i<arr.Length; i+=2 ) {
        d.Add( (string)arr[i], arr[i+1] );
    }
}

使用例:

MyMethod( string1, value1, string2, value2 );
于 2012-08-23T20:22:53.237 に答える
1

メソッドの入力を極限まで短くすることに固執するなら、私は Ethan Brown と同じ方針に沿って考えていました。paramsこれは、辞書要素の入力に使用する小さなプログラムです。

class Program
{
    static void Main(string[] args)
    {
        MyMethod("Key1", 1, "Key2", 2, "Key3", 3);
    }

    static void MyMethod(params object[] alternatingKeysValues)
    {
        var dictionary = AlternatingKeysValuesToDictionary(alternatingKeysValues);
        // etc...
    }

    static Dictionary<string, object> AlternatingKeysValuesToDictionary(params object[] alternatingKeysValues)
    {
        if (alternatingKeysValues.Count() % 2 == 1)
            throw new ArgumentException("AlternatingKeysValues must contain an even number of items.");
        return Enumerable
            .Range(1, alternatingKeysValues.Count() / 2)
            .ToDictionary(
                i => (string)alternatingKeysValues.ElementAt(i * 2 - 2),
                i => alternatingKeysValues.ElementAt(i));
    }
}

そうは言っても、エリックの答えのようなものが実際には優れていると思います。非常に冗長なものにショートカットを割り当てると、明確性や組み込みのコレクション初期化子Dictionary<object, string>によって提供される自然なエラー チェックを犠牲にすることなく、理想にかなり近づけることができます。Dictionary

ただし、もう少し明確な表現を使用します。

using Dict = System.Collections.Generic.Dictionary<string, object>;

使用法:

MyMethod(new Dict {{string1, value1},{string2, value2}});

さらに良いことに、キーがで値が のDict場合、たとえば fruitPrices のように、辞書の内容を実際に説明するものに置き換えます。FruitNamePrice

于 2012-08-23T20:38:55.367 に答える