C#中的键值数组放入参数

时间:2014-03-13 04:42:19

标签: c# php arrays

来自PHP,我以前从未写过C#,我在C#遇到过类似的事情:

public string rule(string playerId, string action, params string[] optionalData){
...
}

在PHP中就像这样

public function rule($playerId, $action, $optionalData=array()){
...
}

在PHP中,我只需填写$ optionalData的参数,就像这样......

myVar->rule("123", "myAction", array('url'=>'review.com');

但是在C#中我不知道如何填充optionalData(params string [] optionalData)参数,因为它是一个键值参数(如PHP示例中所示)。我的问题是如何创建一个键值数组,就像我在我的示例中创建的PHP并放入参数?

CoolClass cc = new CoolClass();
cc.rule("123", "myAction", ???);

我正在搜索谷歌,正在查看字典和哈希图等,但我猜这是一个矫枉过正或它不起作用..

非常感谢!

3 个答案:

答案 0 :(得分:0)

您可以使用词典:

Dictionary<string,string[]>

或类似的东西:

Dictionary<int, string[]>

我相信字典会适用于你的情况。

答案 1 :(得分:0)

当你看着字典时,你肯定在寻找合适的设施。

如果C#中的rule()位于您自己的代码中,我是否可以建议您将签名更改为:

public string rule(string playerId, string action, IDictionary<string, string> optionalData = new Dictionary<string, string>()){
...
}

这可以让你做到:

  • optionalData的方式操作其他C#程序员期望的方式。
  • 建议的方法签名的= new Dictionary<string, string>()部分使参数真正可选。调用方法时没有必要。
  • 您可以使用IDictionary<T>方法处理数据。您应该熟悉一些语法(考虑通过键optionalData["someString"]访问。)

但是,如果您的代码中没有rule(),则只需省略参数即可省略optionalData。您问题中原始C#方法的有效调用示例:

  • rule("Bob", "load")
  • rule("Bob", "load", "url", "www.example.com")(在这种情况下,optionalData[0].Equals("url", StringComparisonOptions.Ordinal)optionalData[1].Equals("www.example.com", StringComparisonOptions.Ordinal)为真。

关于原始方法需要考虑的一件事 - 请记住rule("Bob", "load", 'url")是一个有效的调用,您需要进行运行时检查以确保您拥有正确数量的参数。使用Dictionary<TKey, TValue>的另一个好处。如果无法更改原始rule(),您甚至可以考虑编写适配器方法。

答案 2 :(得分:0)

您可以使用Dictionary <key_datatype, value_datatype>

示例:

您的方法定义:

public string rule(string playerId, string action, Dictionary<string, string> optionalData){
...
}

方法调用:

Dictionary<string, string> optionalData = new Dictionary<string, string>();
optionalData.Add("url", "review.com");

cc.rule("123", "myAction", optionalData);

或者

您可以使用DynamoObject使其更容易编写:

    dynamic optionalData = new ExpandoObject();

//The token after the dynamoObject period will be the key to the assigned value.
    optionalData.url = "review.com";

    cc.rule("123", "myAction", optionalData);

您的方法可以获得如下的键值对:

public string rule(string playerId, string action, dynamic optionalData)
{
...

            foreach (var pair in (IDictionary<string, object>)optionalData)
            {
                if (group.Key == "url")
                {
                   Console.WriteLine(group.Value);
                }
                else if (group.Key == "post")
                {
                    Console.WriteLine(group.Value);
                }
            }
 }