Как преобразовать словарь <string, string> в строку атрибутов в LINQ? - PullRequest
0 голосов
/ 07 октября 2011

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 07 октября 2011

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

.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));

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

3 голосов
/ 07 октября 2011
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());
0 голосов
/ 07 октября 2011

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

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);
0 голосов
/ 07 октября 2011
string.Join(" ", myDict.Select(d => string.Format("{0} = {1}", d.Key, d.Value)))
...