Подтвердить что ты не робот

Лучший способ конвертировать словарь <string, string> в единое совокупное представление String?

Как бы преобразовать словарь пар значений в одну строку? Можете ли вы сделать это с помощью агрегатов LINQ? Я видел примеры этого, используя список строк, но не словарь.

Ввод:

Dictionary<string, string> map = new Dictionary<string, string> { 
          {"A", "Alpha"},  
          {"B", "Beta"}, 
          {"G", "Gamma"}
};

Вывод:

  string result = "A:Alpha, B:Beta, G:Gamma";
4b9b3361

Ответ 1

Это самый краткий способ, о котором я могу думать:

var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value).ToArray());

Однако, в зависимости от ваших обстоятельств, это может быть быстрее (хотя и не очень элегантно):

var result = map.Aggregate(new StringBuilder(),
    (a, b) => a.Append(", ").Append(b.Key).Append(":").Append(b.Value),
    (a) => a.Remove(0, 2).ToString());

Я запускал каждый из них с различным количеством итераций (10 000, 1 000 000, 10 000 000) в вашем трехпозиционном словаре и на моем ноутбуке, последний был в среднем на 39% быстрее. В словаре с 10 элементами последний был только на 22% быстрее.

Еще одно замечание: простая конкатенация строк в моем первом примере была примерно на 38% быстрее, чем string.Format() вариант mccow002 answer, так как я подозреваю, что он бросает в небольшом построителе строк вместо конкатенации, учитывая почти идентичные показатели производительности.

Чтобы воссоздать исходный словарь из строки результата, вы можете сделать что-то вроде этого:

var map = result.Split(',')
    .Select(p => p.Trim().Split(':'))
    .ToDictionary(p => p[0], p => p[1]);

Ответ 2

string result = string.Join(", ", map.Select(x => string.Format("{0}:{1}", x.Key, x.Value)).ToArray())

Ответ 3

Здесь используется Метод LINQ Aggregate:

map
.Select(m => $"{m.Key}:{m.Value}")
.Aggregate((m1, m2) => $"{m1}, {m2}");

То же, но с string.Format():

map
.Select(m => string.Format("{0}:{1}", m.Key, m.Value))
.Aggregate((m1, m2) => string.Format("{0}, {1}", m1, m2))