Группировка списка словарей в C#

#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, удачи