Как преобразовать словарь в строку атрибута в LINQ?

#c# #string #linq #aggregate-functions

#c# #строка #linq #агрегатные функции

Вопрос:

У меня есть коллекция ключей / значений в виде a Dictionary<string, string> .

Как бы вы преобразовали или объединили это в строку атрибута:

 key1="value1" key2="value2" key3="value3"
  

Я считаю, что этого можно достичь с помощью агрегатной функции, однако я нахожу документацию по этому конкретному методу расширения запутанной. Любая помощь приветствуется.

Ответ №1:

Я бы использовал:

.NET 4:

 var text = string.Join(" ", 
              dictionary.Select(pair => string.Format("{0}={1}",
                                pair.Key, pair.Value));
  

.NET 3.5 (где string.Join меньше перегрузок)

 var text = string.Join(" ", 
              dictionary.Select(pair => string.Format("{0}={1}",
                                pair.Key, pair.Value)
                        .ToArray());
  

Если вам нужно выполнить какое-либо экранирование, сделайте это в string.Format вызове. Конечно, вам не нужно использовать string.Format — вы могли бы использовать:

 var text = string.Join(" ", dict.Select(pair => pair.Key   "="   pair.Value));
  

Это зависит от того, что вы считаете более читаемым. (Разница в производительности будет незначительной.)

Ответ №2:

 var dict = new Dictionary<string, string>
                {
                    {"1", "first"},
                    {"2", "second"}
                };

var result = dict.Aggregate(new StringBuilder(),
                            (sb, kvp) => sb.AppendFormat("{0}="{1}" ", kvp.Key, kvp.Value),
                            sb => sb.ToString());
  

Комментарии:

1. 1 за то, что показал мне, как это сделать с помощью Aggregate. Я собираюсь использовать ответ Skeet, потому что он хорошо обрабатывает конечное пространство и потому, что его легче понять новичкам. Тем не менее, большое спасибо!

Ответ №3:

 string.Join(" ", myDict.Select(d => string.Format("{0} = {1}", d.Key, d.Value)))
  

Ответ №4:

Итак, вы хотите, чтобы ключи и значения словаря выводились в виде строки таким образом? Звучит достаточно просто:

 var myDictionary = new Dictionary<string,string>();
//populate Dictionary

//a Dictionary<string,string> is an IEnumerable<KeyValuePair<sring,string>>
//so, a little Linq magic will work wonders
var myAttributeString = myDictionary.Aggregate(new StringBuilder(), (s, kvp) => s.Append(kvp.Key   "=""   (kvp.Value ?? String.Empty)   "" "));
  

Результатом будет строка, подобная той, что указана в вашем вопросе, с конечным пробелом (который в XML не имеет большого значения, но вы можете обрезать его, если хотите).

Вы также могли бы использовать .Функции XML NET позволяют фактически помещать значения в XML в виде строки атрибута элемента. Строка атрибута окажется в элементе XML в документе, который, вероятно, туда, куда он должен идти в любом случае:

 XMLDocument doc = new XMLDocument()
XMLElement myElement = doc.CreateElement("myElement")

foreach(var kvp in myDictionary)
   myElement.SetAttribute(kvp.Key, kvp.Value);
  

Комментарии:

1. Я бы постарался избежать использования повторной конкатенации строк, подобной этой, хотя … StringBuilder в качестве типа объединения будет работать лучше IMO.