2012-03-09 13 views
0

メソッドパラメータの代替パラメータがありますか?
私はキーワードparamsが好きです。しかし、時には私はのパラメータである2つのパラメータが必要です。
私はそうのようなメソッドを呼び出したい:交互のパラメータ

1、2及び3は、値が割り当てられたキーと "A"、 "B" および "C" である
Method(1, "a", 2, "b", 3, "c") 

私は直感的にそうような2つのパラメータののparamsを使用しようとするメソッドのパラメータを定義しようとした場合:

void Method(params int[] i, string[] s) 

コンパイラは、最初のパラメータとのすべてのパラメータに奇妙な位置にすべてのパラメータを追加します第2のパラメータへの位置も揃えます。
(ご存知のように)パラメータは、最後のパラメータでのみ使用できます。もちろん

私は、パラメータクラスを作成します(例えばKeyValue)ので、それを使用することができます。

Method(new[] {new KeyValue(1, "a"), new KeyValue(2, "b"), new KeyValue(3, "c")}) 

しかし、それは芋あまりにも多くのコードです。

短い表記はありますか?

編集:それは一覧を継承し、新たなリストは、この方法で初期化することができるようにメソッドを追加します。オーバーロードすることを提案:

はちょうど今、私は別の質問に良い answerを見つけました
new KeyValueList<int, string>{{ 1, "a" }, { 2, "b" }, { 3, "c" }} 

メソッドの定義は次のようになります。

void Method(KeyValueList<int, string> list) 

コールは次のようになります。

Method(new KeyValueList<int, string>{{ 1, "a" }, { 2, "b" }, { 3, "c" }}) 
+0

パラメータクラスを作成した場合(または 'Tuple'を使用する場合)、' params'キーワードを使用して、 'new {] {...}'を取り除くことができます。 –

+0

いいえあなたが求めているようなものはありません。 'KeyValue'構文を短縮するには、パラメータの型として' params KeyValue [] pairs'を使うことができます。結果は 'Method(新しいKeyValue(1、" a ")、新しいKeyValue(2、" b ")、新しいKeyValue(3、" c "))'になります。それほど短くはない。 –

+0

あなたはキーと値のペアを持っていますが、唯一正しい方法は、あなたの「あまりにも多くのコード」が悪質なコードを取り除かなければならないかもしれない貧しい人々を考えるなら、何らかの形のKey/Valueコレクションを使用することですいくつかの後の段階で! – Lloyd

答えて

3

説明されているように「交互パラメータ」表記はありません。

は1つのだけですparamsのパラメータを持つことができ、それが最後でなければなりません - あなたは配列型としてobjectを使用することができるのparamsパラメータなど、さまざまなタイプを持っているしたい場合。

これらの項目の意味を保持するカスタムタイプからなるリストを渡すことを検討してください。

public class MyType 
{ 
    public int MyNum { get; set; } 
    public string MyStr { get; set; } 
} 

Method(List<MyType> myList); 
+1

ありがとうございます。 * params *配列を使用する代わりに、呼び出し元**が 'List'を使用する利点がありますか? – brgerner

+0

@brgerner - セマンティクスと可読性。あなたは 'params object [] items'で型の安全性を持っていません。 – Oded

+1

はい。私は*メソッド(params MyType [] myList)*との比較を意味していました。 – brgerner

1

あなたは何に行くと、すべてのボクシング/アンボクシングで、そのビット不快params object[] keysAndValuesを経由して、これを行うと、自分でそれを整理、しかし...ことができます。

関連する問題