Converter dicionário <string, string> em string separada por ponto e vírgula em c #


135

Simples para começar o dia, considerando o Dictionary<string, string>seguinte:

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

Desejo criar uma string: "A=1;B=2;C=3;D=4"

Um exemplo de implementação:

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();

Observe que é provável que o dicionário tenha menos de 10 itens, o que sugere que um StringBuilder está exagerando.

Quais implementações alternativas são mais sucintas / eficientes? A estrutura possui algum recurso que ajude?

Respostas:


290
using System.Linq;

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

(E se você estiver usando o .NET 4, ou mais recente, poderá omitir a ToArraychamada final .)


Bom :-) No entanto, eu usaria String.Format ("{0} = {1}", x.Key, x.Value) em vez do operador +
Amittai Shapira

7
@Mitmit, @the_drow: você pode preferir string.Format; Eu prefiro k+"="+vconcatenações simples como esta. Cada um com seu próprio eu acho ...
LukeH

2
Observe que a chamada para ToArray()não é necessária. Removê-lo resulta em uma chamada para em String.Join<String>(String, IEnumerable<String>)vez de String.Join(String, String[]).
Dan Stevens

8
Se você não se importa com o formato exato de saída, pode fazê-lo string.Join(", ", myDict). Ele será emitido no formulário[A, 1], [B, 2], [C, 3], [D, 4]
altumano

2
@SRJ Vazio é muito diferente de Nulo .... Vazio ""ou Espaço em Branco " ", são chaves válidas em um Dicionário. Embora não seja recomendado o uso de ambos, eles são valores válidos. Você precisa fazer uma ContainsKeyverificação se precisar de um Nome de Chave específico ou da construção de idioma equivalente a foreachpara capturar os valores.
GoldBishop 21/02

39

Outra opção é usar a extensão Agregada em vez de Participar:

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

estilo linq perfeito!
Menkow 18/08

1

Para o Linq funcionar, Dictionaryvocê precisa de pelo menos .Net v3.5 e using System.Linq;.

Algumas alternativas:

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

ou

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

Se você não puder usar o Linq por algum motivo, use 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

Esta é a mesma resposta que @LukeH tem acima.
Rick Glos

cara, não é o mesmo, não há necessidade de usar ToArray (). Por favor, não vote abaixo da minha resposta.
Jaydeep Shil 23/08/19

2
É o mesmo - ele menciona a remoção ToArray()ao usar versões superiores do framework.
Rick Glos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.