#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.