11

単純。私が使用する場合:

public void Add(params int[] values)

次に、これを次のように使用できます。

Add(1, 2, 3, 4);

しかし今、私はキーと値のペアを扱っています!整数を文字列値にリンクするKeyValueクラスがあります。だから私は始めます:

public void Add(params KeyValue[] values)

しかし、私はこれを使用することはできません:

Add(1, "A", 2, "B", 3, "C", 4, "D");

代わりに、私は使用することを余儀なくされています:

Add(new KeyValue(1, "A"), new KeyValue(2, "B"), new KeyValue(3, "C"), new KeyValue(4, "D"));

Ewww...もう嫌いです...

そのため、現在、params修飾子を指定せずにAdd関数を使用し、事前定義された配列をこの関数に渡すだけです。これはテストの迅速な初期化に使用されるだけなので、コードを読みやすくしたいのですが、この追加のコードが必要になることについてはそれほど問題にはなりません。使用できないメソッドを使用するためのトリックを知りたいのですが、「new KeyValue()」構造を使用せずにこれを行う方法はありますか?

4

3 に答える 3

23

を受け入れた場合は、IDictionary<int,string>おそらく(少なくともC#3.0では)次のように使用できます。

Add(new Dictionary<int,string> {
     {1, "A"}, {2, "B"}, {3, "C"}, {4, "D"}
});

用途はありますか?

Add

static void Add(IDictionary<int, string> data) {
    foreach (var pair in data) {
        Console.WriteLine(pair.Key + " = " + pair.Value);
    }
}
于 2009-09-01T12:51:28.237 に答える
3

現在のクラス設計を変更できますが、ジェネリックスを追加してIEnumerableインターフェイスを使用する必要があります。

    class KeyValue<TKey, TValue>
    {
        public KeyValue()
        {
        }
    }

    // 1. change: need to implement IEnumerable interface
    class KeyValueList<TKey, TValue> : IEnumerable<TKey>
    {
        // 2. prerequisite: parameterless constructor needed
        public KeyValueList()
        {
            // ...
        }

        // 3. need Add method to take advantage of
        // so called "collection initializers"
        public void Add(TKey key, TValue value)
        {
            // here you will need to initalize the
            // KeyValue object and add it
        }

        // need to implement IEnumerable<TKey> here!
    }

これらの追加の後、次のことができます。

    new KeyValueList<int, string>() { { 1, "A" }, { 2, "B" } };

コンパイラは、IEnumerableインターフェイスとAddメソッドを使用してKeyValueListにデータを入力します。C#3.0で動作することに注意してください。

これをテストに使用している場合、これらの変更は価値がありません。これはかなりの労力であり、テスト用にかなり多くの製品コードを変更します。

于 2009-09-01T13:29:16.903 に答える
0

次のようなものを使用できますが、強い型付けを失うという明らかな欠点があります。

 public void Add(params Object[] inputs)
 {
     Int32 numberPairs = inputs.Length / 2;

     KeyValue[] keyValues = new KeyValue[numberPairs];

     for (Int32 i = 0; i < numberPairs; i++)
     {
         Int32 key = (Int32)inputs[2 * i];
         String value = (String)inputs[2 * i + 1];

         keyvalues[i] = new KeyValue(key, value);
     }

     // Call the overloaded method accepting KeyValue[].
     this.Add(keyValues);
 }

 public void Add(params KeyValue[] values)
 {
     // Do work here.
 }

引数のタイプが正しくない場合は、エラー処理を追加する必要があります。それほど賢くはありませんが、機能します。

于 2009-09-01T12:56:21.593 に答える