Перетворити словник <рядок, рядок> у розділений крапкою з комою в 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) замість оператора +
Amittai Shapira

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 Empty дуже відрізняється від Null .... Empty ""або Whitespace " "- дійсні ключі у словнику. Хоча і не рекомендується використовувати жодне, вони є дійсними значеннями. Вам потрібно зробити ContainsKeyперевірку, чи потрібне вам конкретне ім'я ключа або конструкція мови, еквівалентна foreachдля захоплення значень.
GoldBishop

39

Іншим варіантом є використання розширення Aggregate, а не приєднання:

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 (). Будь ласка, не оскаржуйте моєї відповіді.
Jaydeep Shil

2
Це те саме - він згадує про видалення ToArray()при використанні вищих версій фреймворку.
Рік Глос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.