简明的动态键值对列表

4

我正在编写一个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);
  }
}

请注意,这只是伪代码。接下来我想使用以下方式调用此函数:
PrettyPrint("Results:", { quantity:4, total:"$1.23", tax:"0.10" });

我在使用C#时,发现所有的方法都显得很笨重,只是为了传递键值对。我是否忽略了一些东西?在C#中,是否有一种简洁的方式来传递动态的键值对列表?


你可以创建一个数据类,或者只是一个数据表,并用你的键/值对填充它们,然后传递它。 - Brad
你可以传递 Dictionary<string,decimal> 并对其进行操作。 - Samvel Petrosov
我听到键值对,就想到了字典,因为这正是它的用途。 - Rainbow
你可以使用 public void PrettyPrint(string message, params object[] kvp) 方法,其中每个第二个参数都是值 - 因此 [0] = 键,[1] = 值,[3] = 键,[4] = 值... 是编写它的“最短”形式。 - Rand Random
4个回答

7
你可以使用 C# 7 的值元组和 params 关键字:

值元组params 关键字:

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
我认为最接近你所需的语法可能是通过接受普通的对象并反射其属性来实现:
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" });

这基本上与您在JavaScript中所做的相同(您用于示例想要的语法)。


你可以在这里创建一个小的扩展方法来使它看起来更接近原始代码:obj.GetType().GetProperties().Select(o => new KeyValuePair<object, object>(o.Name, o.GetValue(obj))); - Scroog1

0

Dictionary 的问题在于定义要传递给方法的键值对。除非有一种简洁的方式,否则它似乎很笨重。 - user687554
由于您的示例仅使用字符串作为值,因此您可以将其泛化为“Dictionary<string,object>”以适应所有类型。请注意,您无法对值执行任何特定于类型的操作。 - Flater

0
你可以使用Json.Net等工具。这样,您可以提交绝对任何对象。
public void PrettyPrint(string message, object kvp)
{
    Console.WriteLine(message);
    var json = JsonConvert.SerializeObject(kvp, Formatting.Indented);
    Console.WriteLine(json);
}

结果非常漂亮。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接