8

**kwargsC#に Python に相当するものはありますか? 可変数の名前付き引数を関数に渡し、それらを関数内の辞書のようなものとして取得し、それらを循環できるようにしたいと考えています。

4

5 に答える 5

13

このような任意の名前付きパラメーターを渡すことができる C# には何もありません。

パラメーターを追加することで近づくことがDictionary<string, object>できます。これにより、同様のことを行うことができますが、コンストラクター、「パラメーター名」を文字列にする必要があり、いくつかの追加の中括弧が必要です。

static void Method(int normalParam, Dictionary<string, object> kwargs = null)
{
   ...
}

Method(5, new Dictionary<String, object>{{ "One", 1 }, { "Two", 2 }});

hereを使用するObjectToDictionaryRegistryと、さらに近づくことができます。これにより、辞書型に名前を付けたり、パラメーター名を文字列として渡したり、非常に多くの中括弧を追加したりする必要のない匿名オブジェクトを渡すことができます。

static void Method(int normalParam, object kwargs = null)
{
    Dictionary<string, object> args = ObjectToDictionaryRegistry(kwargs);
    ...
}

Method(5, new { One = 1, Two = 2 });

ただし、これには動的コード生成が含まれるため、パフォーマンスの面でコストがかかります。

構文に関しては、これが必要とする `new { ... }' ラッパーを取り除くことができるとは思えません。

于 2012-12-18T14:24:48.217 に答える
2

値の配列ではなく一連の値が特に必要な場合はKeyValuePairs、次のようにすることができます。

public class Foo
{
    public Foo(params KeyValuePair<object, object>[] myArgs)
    {
        var argsDict = myArgs.ToDictionary(k=>k.Key, v=>v.Value);
        // do something with argsDict
    }
}

myArgsKeyValuePair<object, object>上記のように、反復または辞書に変換できる配列になります。ただし、KeyValuePair<>同じキーで複数の を渡すと、ディクショナリへの変換が失敗する可能性があります。ディクショナリに変換する前に、事前にいくつかのチェックを行う必要がある場合があります。

次のように呼び出します。

KeyValuePair<object, object> myKvp1 = new KeyValuePair<object, object>(someKey1, someValue1);
KeyValuePair<object, object> myKvp2 = new KeyValuePair<object, object>(someKey2, someValue2);
KeyValuePair<object, object> myKvp3 = new KeyValuePair<object, object>(someKey3, someValue3);

Foo foo = new Foo(myKvp1, myKvp2, myKvp3);
于 2012-12-18T14:08:55.973 に答える
1

はい。オプションの名前付きパラメーターを使用する機能は、C#4.0で追加されたと思います。

http://msdn.microsoft.com/en-us/library/dd264739(v=vs.100).aspx

于 2012-12-18T14:12:41.887 に答える
0
void paramsExample(object arg1, object arg2, params object[] argsRest)
{
    foreach (object arg in argsRest)
    { /* .... */ }
}

このように呼んでください、

paramsExample(1, 0.0f, "a string", 0.0m, new UserDefinedType());
于 2012-12-18T14:02:54.120 に答える
0

次のように、関数の最終引数として param リストを使用できます。

void paramsExample(object arg1, object arg2, params object[] argsRest) {
    foreach (object arg in argsRest)
    { /* .... */ }
}

メソッドは、任意の型の任意の数の引数で呼び出すことができます。

paramsExample(1, 0.0f, "a string", 0.0m, new UserDefinedType());

これは厳密に型指定された引数なので、文字列のリストを使用したい場合は、次のようにできます。

 public string Concat(string separator, params string[] strings) {
      string result = "";
      for (int i = 0; i < strings.Length; i++) {
          if (i > 0)
              result += separator;
          result += strings[i];
      }    
      return result;
 }

呼び出す:

MessageBox.Show(Concat("+", "Anders", "Eric", "Scott", "Duncan") + " = great team");

詳細については、こちらをご覧ください: http://blogs.msdn.com/b/csharpfaq/archive/2004/05/13/how-do-i-write-a-method-that-accepts-a-variable-number- of-parameters.aspx

于 2012-12-18T14:10:43.120 に答える