использование Enumerable.Aggregate для System.Collection.Generic.Dictionary

2

Скажем, что у меня есть общий словарь с данными вроде этого (надеюсь, здесь обозначение будет понятным):

{   "param1" = > "value1",   "param2" = > "value2",   "param3" = > "value3" }

Я пытаюсь использовать функцию Enumerable.Aggregate, чтобы сбрасывать каждую запись в словаре и выводить что-то вроде этого:

"/param1 = value1;/param2 = value2;/param3 = value3"

Если бы я собирал список, это было бы легко. С помощью словаря я получаю парные пары ключ/значение.

Теги:
linq
generics

3 ответа

8
Лучший ответ

Вам не нужно Aggregate:

String.Join("; ", 
    dic.Select(x => String.Format("/{0}={1}", x.Key, x.Value)).ToArray())

Если вы действительно хотите его использовать:

dic.Aggregate("", (acc, item) => (acc == "" ? "" : acc + "; ") 
                        + String.Format("/{0}={1}", item.Key, item.Value))

Или:

dic.Aggregate("", 
     (acc, item) => String.Format("{0}; /{1}={2}", acc, item.Key, item.Value), 
     result => result == "" ? "" : result.Substring(2));
  • 0
    Спасибо! Глядя на код dic.aggregate, я понимаю, почему решение String.Join лучше подходит для этого.
  • 0
    Но String.Join метод String.Join не проходит String.Join по словарю (один раз для настройки массива и второй раз для объединения элементов массива)? Вы также создаете одноразовый массив, когда вы можете присоединиться к вашей строке так же, как вы проходите по элементам.
Показать ещё 1 комментарий
1

Я считаю, что это соответствует вашим потребностям:

        var dictionary = new Dictionary<string, string> {{"a", "alpha"}, {"b", "bravo"}, {"c", "charlie"}};
        var actual = dictionary.Aggregate("", (s, kv) => string.Format("{0}/{1}={2}; ", s, kv.Key, kv.Value));
        Assert.AreEqual("/a=alpha; /b=bravo; /c=charlie; ", actual);
  • 0
    Это оставило бы вас с лишним ";" в конце концов. Большую часть времени (а также для первоначального вопроса, кажется) это нежелательно.
  • 0
    Будут добавлены дополнительные символы ";", которые вам придется удалить. Работает в любом случае.
Показать ещё 4 комментария
0

Я думаю, что вы ищете что-то вроде этого:

var str = dic.Aggregate("", (acc, item) => {
    if (acc != "")
        acc += "; ";

    acc += "/" + item.Key + "=" + item.Value;

    return acc;
});
  • 1
    Не сработает Вам необходимо вернуть в acc .
  • 0
    Это то, что вы получаете за переход от простого лямбда-синтаксиса к телу функции в последнюю минуту. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню