关键值对的简明动态列表

时间:2018-04-27 13:59:37

标签: c#

我正在编写一个C#应用程序。在那个应用程序中,我需要传递任意键值对列表。我想将这些键/值传递给看起来像这样的实用程序方法:

public void PrettyPrint(string message, [type?] kvp)
{
  Console.WriteLine(message);
  foreach (var p in kvp)
  {
    Console.Write(p.Key + "\t\t\t" + p.Value);
  }
}

请注意,那只是pseduocode。然后我想用这样的东西来调用这个函数:

PrettyPrint("Results:", { quantity:4, total:"$1.23", tax:"0.10" });

我使用C#看到的所有内容对于传递键值对来说似乎都很笨重。我是否有些偏见?是否有简洁的方法只是在C#

中传递一个动态的键值对列表

4 个答案:

答案 0 :(得分:5)

您可以使用C#7的value tuplesparams关键字:

public static void PrettyPrint(string message, params (object key, object value)[] kvp)
{
    Console.WriteLine(message);
    foreach (var p in kvp)
    {
        Console.Write(p.key + "\t\t\t" + p.value);
    }
}

这样称呼:

PrettyPrint("Results: ", ("quantity", 4), ("total", "$1.23"), ("tax", 0.10));

或者,将对存储在变量中:

(object, object)[] pairs = {("quantity", 4), ("total", "$1.23"), ("tax", 0.10)};
PrettyPrint("Results: ", pairs);

或稍微简洁地使用类似foreach (var (key, value) in kvp)的循环来避免方法签名中的p和项目名称

public static void PrettyPrint(string message, params (object, object)[] kvp)
{
    Console.WriteLine(message);
    foreach (var (key, value) in kvp)
    {
        Console.Write($"{key}\t\t\t{value}");
    }
}

答案 1 :(得分:1)

通过接受普通object并反映其属性,可以实现与我所需要的最接近(通过语法):

public static void PrettyPrint(string message, object kvp) {
    if (kvp == null)
        return;
    Console.WriteLine(message);
    foreach (var p in kvp.GetType().GetProperties()) {
        Console.Write(p.Name + "\t\t\t" + p.GetValue(kvp));
    }
}

那是因为那时你可以在那里传递匿名对象:

PrettyPrint("Results:", new { quantity = 4, total = "$1.23", tax = "0.10" });

这与你在javascipt中所做的基本相同(你用什么语法作为你想要的例子)。

答案 2 :(得分:0)

您可以使用Dictionaryhttps://msdn.microsoft.com/de-de/library/xfhwa508(v=vs.110).aspx)或List<Tuple<string,float>>例如

PrettyPrint("Results:", new Dictionary<string, float>() 
{
   { "quantity",4 }, 
   { "total", 1.23 }
});

答案 3 :(得分:0)

您可以使用,例如,Json.Net。这样您就可以绝对提交任何对象。

public void PrettyPrint(string message, object kvp)
{
    Console.WriteLine(message);
    var json = JsonConvert.SerializeObject(kvp, Formatting.Indented);
    Console.WriteLine(json);
}

结果很漂亮。