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가 과도하게 사용됨을 나타냅니다.

어떤 간결한 구현이 간결하고 효율적입니까? 프레임 워크에 도움이되는 기능이 있습니까?

답변:


290
using System.Linq;

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

.NET 4 이상을 사용하는 경우 최종 ToArray통화를 생략 할 수 있습니다 .


Nice :-) 그러나 + 연산자 대신 String.Format ( "{0} = {1}", x.Key, x.Value)을 사용합니다.
Amittai Shapira

7
@Amittai, @the_drow : 선호 할 수도 있습니다 string.Format; 나는 k+"="+v이와 같은 간단한 연결을 선호 합니다. 내가 생각하는대로 ...
LukeH

2
호출 할 ToArray()필요가 없습니다. 제거하면 String.Join<String>(String, IEnumerable<String>)대신에 전화가 걸립니다 String.Join(String, String[]).
Dan Stevens

8
정확한 출력 형식에 신경 쓰지 않으면 할 수 있습니다 string.Join(", ", myDict). 그것은 것이다 형태로 출력[A, 1], [B, 2], [C, 3], [D, 4]
altumano

2
@SRJ Empty는 Null과는 매우 다릅니다 .... Empty ""또는 Whitespace " "는 사전의 유효한 키입니다. 둘 중 하나를 사용하는 것은 좋지 않지만 유효한 값입니다. 당신은 할 필요가 ContainsKey특정 키 이름이나하는 언어 구조에 상응해야하는 경우 검사를 foreach값을 캡처 할 수 있습니다.
GoldBishop

39

또 다른 옵션은 Join 대신 Aggregate 확장을 사용하는 것입니다.

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와 동일한 대답입니다.
Rick Glos

친구가 동일하지 않으므로 ToArray ()를 사용할 필요가 없습니다. 제 답변을 공감하지 마십시오.
Jaydeep Shil

2
그것은 동일합니다-그는 ToArray()더 높은 버전의 프레임 워크를 사용할 때 제거하는 것을 언급합니다 .
Rick Glos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.