在C#中将Dictionary <string,string>转换为以分号分隔的字符串


135

简单的开始一天,给出Dictionary<string, string>如下:

var myDict = new Dictionary<string, string>();
myDict["A"] = "1";
myDict["B"] = "2";
myDict["C"] = "3";
myDict["D"] = "4";

我希望创建一个字符串: "A=1;B=2;C=3;D=4"

一个示例实现:

var myStringBuilder = new StringBuilder();
bool first = true;
foreach (KeyValuePair<string, string> pair in myDict)
{
    if (first)
    {
        first = false;
    }
    else
    {
        myStringBuilder.Append(";");
    }

    myStringBuilder.AppendFormat("{0}={1}", pair.Key, pair.Value);
}

var myDesiredOutput = myStringBuilder.ToString();

请注意,字典中的项目可能少于10个,这表明StringBuilder过于强大。

哪些替代实现更简洁/有效?该框架是否有任何功能会有所帮助?

Answers:


290
using System.Linq;

string s = string.Join(";", myDict.Select(x => x.Key + "=" + x.Value).ToArray());

(并且,如果您使用的是.NET 4或更高版本,则可以省略最终ToArray调用。)


不错:-)但是,我将使用String.Format(“ {0} = {1}”,x.Key,x.Value)而不是+运算符
Shapira 2010年

7
@ Amittai,@ the_drow:您可能更喜欢string.Format;我更喜欢这样k+"="+v的简单串联。我猜每个人……
LukeH 2010年

2
请注意,ToArray()不需要调用。删除它会导致呼叫,String.Join<String>(String, IEnumerable<String>)而不是String.Join(String, String[])
丹·史蒂文斯

8
如果您不关心确切的输出格式,则可以 string.Join(", ", myDict)。它将以以下格式输出[A, 1], [B, 2], [C, 3], [D, 4]
altumano '16

2
@SRJ Empty与Null完全不同。...Empty ""或Whitespace " "是字典中的有效键。尽管不建议使用其中任何一个,但它们是有效值。您需要ContainsKey检查是否需要特定的键名或等同foreach于捕获值的语言构造。
GoldBishop

39

另一种选择是使用Aggregate扩展而不是Join:

String s = myDict.Select(x => x.Key + "=" + x.Value).Aggregate((s1, s2) => s1 + ";" + s2);

完美的linq风格!
menkow

1

为了使Linq能够正常工作,Dictionary您至少需要.Net v3.5using System.Linq;

一些替代方案:

string myDesiredOutput = string.Join(";", myDict.Select(x => string.Join("=", x.Key, x.Value)));

要么

string myDesiredOutput = string.Join(";", myDict.Select(x => $"{x.Key}={x.Value}"));

如果由于某种原因无法使用Linq,请使用Stringbuilder

StringBuilder sb = new StringBuilder();
var isFirst = true;
foreach(var x in myDict) 
{
  if (isFirst) 
  {
    sb.Append($"{x.Key}={x.Value}");
    isFirst = false;
  }
  else
    sb.Append($";{x.Key}={x.Value}"); 
}

string myDesiredOutput = sb.ToString(); 

myDesiredOutput:

A=1;B=2;C=3;D=4

-3

这与@LukeH上面的答案相同。
里克·格洛斯

伙计,它是不一样的,不需要使用ToArray()。请不要拒绝我的回答。
Jaydeep Shil

2
这是相同的-他提到ToArray()在使用更高版本的框架时将其删除。
里克·格罗斯,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.