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

Iai*_*ain 125 c#

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

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

我想创建一个字符串: "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();
Run Code Online (Sandbox Code Playgroud)

请注意,字典可能少于10个项目,这表明StringBuilder过度.

哪些替代实施更简洁/高效?框架是否有任何有用的功能?

Luk*_*keH 271

string s = string.Join(";", myDict.Select(x => x.Key + "=" + x.Value).ToArray());
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你不关心确切的输出格式,你可以做`string.Join(",",myDict)`.它将以"[A,1],[B,2],[C,3],[D,4]的形式输出 (8认同)
  • @Amittai,@ the_drow:你可能更喜欢`string.Format`; 对于像这样的简单连接,我更喜欢`k +"="+ v`.我猜每个都是他们自己的...... (7认同)
  • 请注意,不需要调用 `ToArray()`。删除它会导致调用`String.Join&lt;String&gt;(String, IEnumerable&lt;String&gt;)` 而不是`String.Join(String, String[])`。 (2认同)
  • @SRJ空与Null完全不同。...空`“”“或空白`”“`是字典中的有效键。尽管不建议使用其中任何一个,但它们是有效值。如果需要特定的键名或等效于“ foreach”的语言构造来捕获值,则需要执行“ ContainsKey”检查。 (2认同)

Gib*_*nag 39

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

String s = myDict.Select(x => x.Key + "=" + x.Value).Aggregate((s1, s2) => s1 + ";" + s2);
Run Code Online (Sandbox Code Playgroud)


c-c*_*vez 6

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

一些替代方案:

string myDesiredOutput = string.Join(";", myDict.Select(x => string.Join("=", x.Key, x.Value)));
Run Code Online (Sandbox Code Playgroud)

或者

string myDesiredOutput = string.Join(";", myDict.Select(x => $"{x.Key}={x.Value}"));
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因无法使用 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(); 
Run Code Online (Sandbox Code Playgroud)

我的期望输出:

A=1;B=2;C=3;D=4
Run Code Online (Sandbox Code Playgroud)