#c# #list #linq #dictionary
Вопрос:
У меня есть список словарей, как показано ниже:
Listlt;Dictionarylt;string, objectgt;gt; itemList = new Listlt;Dictionarylt;string, objectgt;gt;(); itemList.Add(new Dictionarylt;string, objectgt;() { { "Item", "001" }, { "Category", "A" }, { "Quantity", 5 } }); itemList.Add(new Dictionarylt;string, objectgt;() { { "Item", "002" }, { "Category", "B" }, { "Quantity", 8 } }); itemList.Add(new Dictionarylt;string, objectgt;() { { "Item", "001" }, { "Category", "A" }, { "Quantity", 6 } });
Как бы я написал свой запрос Linq, чтобы получить результат, как показано ниже
Output (list of dictionaries): { "Item" = "001", "Category" = "A", "Quantity" = 11}, { "Item" = "002", "Category" = "B", "Quantity" = 8}
Комментарии:
1. Я предполагаю, что необработанные данные поступают из sql или что-то в этом роде? Если это так, я бы предложил десериализовать данные в объект вместо словаря.
2. @LeisenChang Да, если десериализовать его в объект, писать запрос linq станет проще. Но наша система позволяет пользователю динамически добавлять новое поле без повторной компиляции кода, поэтому тип словаря-лучший способ, который я нашел (на данный момент)…
Ответ №1:
Это должно сработать:
Listlt;Dictionarylt;string, objectgt;gt; resultList = itemList .Select(d =gt; (Item:d["Item"], Category:d["Category"], Quantity:d["Quantity"])) .GroupBy(x =gt; (Item: x.Item, Category: x.Category)) .Select(g =gt; new Dictionarylt;string, objectgt; { {"Item",g.Key.Item},{"Category",g.Key.Category},{"Quantity",g.Sum(x =gt; (int)x.Quantity)}}) .ToList();
Комментарии:
1. Плюс 1 для результата словаря, хотя, честно говоря, не должно быть словарей, участвующих в вводе или выводе 🙂 Кажется вероятным сомнительное проектное решение в восходящем потоке
2. @TheGeneral: Да, обычно вы используете классы вместо словарей 😉
Ответ №2:
Дано
var results = itemList .GroupBy(x =gt; new { Item = x["Item"], Category = x["Category"] }) .Select(x =gt; new { x.Key.Item, x.Key.Category, Quantity = x.Sum(y =gt; (int)y["Quantity"]) }); foreach (var result in results) Console.WriteLine($"{result.Item} {result.Category} {result.Quantity}");
Выход
001 A 11 002 B 8
Комментарии:
1. Хотя результат не в формате словаря, но это именно то, что я хочу. Спасибо!
2. @alexkor1911 nps, удачи