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

154

轻松开始新的一天,给出一个如下的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会过度。

有哪些更为简洁/高效的替代实现?框架是否具有任何有助于的特性?

4个回答

335
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),而不是 + 运算符。 - Amittai Shapira
根据评论进行了编辑。 - the_drow
8
@Amittai, @the_drow:你们可能更喜欢使用 string.Format;而我则更喜欢像这样简单的字符串拼接,即 k+"="+v。我想每个人都有自己的偏好吧... - LukeH
13
如果您不在意精确的输出格式,可以使用string.Join(", ", myDict)。它将以[A, 1],[B, 2],[C, 3],[D, 4]的形式输出。 - altumano

41

另一个选项是使用聚合扩展而不是连接:

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

完美的LINQ风格! - menkow

4
要使用 Linq 操作 Dictionary,需要至少使用 .Net v3.5 ,并且要添加 using 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(); 

我的期望输出:

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

-3

这是与@LukeH上面相同的答案。 - Rick Glos
兄弟,它们不一样,没有必要使用ToArray()。请不要给我的答案投反对票。 - Jaydeep Shil
2
这是一样的 - 他提到在使用更高版本的框架时删除 ToArray() - Rick Glos

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