Преобразовать словарь <string, string> в строку, разделенную точкой с запятой, в c #


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вызов.)


Хорошо :-) Однако я бы использовал String.Format ("{0} = {1}", x.Key, x.Value) вместо оператора +
— Амиттай Шапира

7
@Amittai, @the_drow: Вы можете предпочесть string.Format; Я предпочитаю k+"="+vдля простых объединений, как это. Я думаю, каждому свое ...
— Луки

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

2
@SRJ Пусто очень отличается от Null .... Пусто "", или Пробел " ", являются действительными ключами в Словаре. Хотя их не рекомендуется использовать, они являются допустимыми значениями. Вам необходимо 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.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(); 

myDesiredOutput:

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

-3

Это тот же ответ, который @LukeH имеет выше.
— Рик Глос

чувак это не то же самое, нет необходимости использовать ToArray (). Пожалуйста, не отрицайте мой ответ.
— Джэйдип Шил

2
То же самое - он упоминает об удалении ToArray()при использовании более высоких версий фреймворка.
— Рик Глос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.