Как умножить и сложить вложенный словарь в C #? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть словарь в C # с этой структурой:

Dictionary<int, Dictionary<string, double>> dictionary = new Dictionary<int, Dictionary<string, double>>
        {
            {
                0, new Dictionary<string, double>
                {
                    { "eat",0.15 },
                    { "food", 0.16 }
                }
            },
            {
                1, new Dictionary<string, double>
                {
                    { "eat",0.32 },
                    { "food", 0.2 }
                }
            },
        };

Я хочу суммировать и умножать еду в другом словаре,

0.15 * 0.32 + 0.16 * 0.2

Что я должен сделать, чтобы кодировать это в C # с foreach?

1009 * большое спасибо *

Ответы [ 4 ]

0 голосов
/ 27 апреля 2018

Вы можете сделать это

var dict = new Dictionary<int, Dictionary<string, double>>() {
                  {0, new Dictionary<string, double>() {{"eat", 0.15}, {"food", 0.16}}}, 
                  {1, new Dictionary<string, double>() {{"eat", 0.32}, {"food", 0.2}}}};

var total = dict.Values.SelectMany(x => x)                // Flatten
                .GroupBy(x => x.Key)                      // Group by key
                .Sum(x => x.Select(y => y.Value)          // sum list of sub values
                           .Aggregate((y, z) => y * z));  // multiply

Console.WriteLine(total);

Выход

0.08

Полная демонстрация здесь

0 голосов
/ 27 апреля 2018

Вы можете решить эту проблему, используя цикл foreach и немного linq в конце, следующим образом:

Dictionary<int, Dictionary<string, double>> data = new Dictionary<int, Dictionary<string, double>>()
        {
            {
                0,new Dictionary<string, double>(){{ "eat" , 0.15 },{ "food" , 0.16} }
            },
            {
                1,new Dictionary<string, double>(){{ "eat" , 0.32 },{ "food" , 0.2 } }
            }
        };
        Dictionary<string, double> finalResultDic = new Dictionary<string, double>();
        foreach (var entry in data)
        {
            foreach (var subEntry in entry.Value)
            {
                if (finalResultDic.ContainsKey(subEntry.Key))
                {
                    finalResultDic[subEntry.Key] *= subEntry.Value;
                }
                else
                {
                    finalResultDic.Add(subEntry.Key, subEntry.Value);
                }
            }
        }
        var finalResult = finalResultDic.Sum(dic => dic.Value);
0 голосов
/ 27 апреля 2018

Попробуйте следующее:

            Dictionary<int, Dictionary<string, double>> dict = new Dictionary<int,Dictionary<string,double>>() {
               {0, new Dictionary<string,double>() {{"eat" , 0.15}, {"food" , 0.16}}}, 
               {1, new Dictionary<string,double>(){{"eat", 0.32},{"food", 0.2}}}
            };

            double total = dict.Select(x => x.Value.Select(y => x.Key * y.Value).Sum()).Sum();
0 голосов
/ 27 апреля 2018

Вот решение LINQ:

Dictionary<int, Dictionary<string, double>> dict = new Dictionary<int, Dictionary<string, double>>() {
    {0,new Dictionary<string, double> { { "eat",0.15 }, { "food", 0.16 } } },
    {1,new Dictionary<string, double> { { "eat",0.32 }, { "food", 0.2 } } }
};

double eat = dict.Values.Select(x => x["eat"]).Aggregate((x, y) => x * y);
double food = dict.Values.Select(x => x["food"]).Aggregate((x, y) => x * y);

double result = eat + food;

EDIT

Вот более компактное и универсальное решение:

var result = dict.SelectMany(x => x.Value)
                 .GroupBy(x => x.Key, y => y.Value, (Key, Value) => new { Value })
                 .Sum(x => x.Value.Aggregate((a, b) => a * b));

результат = 0.08

ДЕМО ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...