2个元素(项目和数量)的列表,在Group By中获得SUM的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2个元素(项目和数量)的列表,在Group By中获得SUM的问题相关的知识,希望对你有一定的参考价值。

我有2个项目的列表,型号和数量。我试图使用Linq得到数量的总和,但我在ModelList.Add(item.qty)得到以下错误; “无法从int转换为字符串。我需要它是一个整数,以便在下面的GroupBy语句中得到Sum。我做错了什么?

[{“sector”:“3”,“position”:“3”,“qty”:“1”,“model”:“SBNHH-1D65C”},{“sector”:“1”,“position”: “4”,“qty”:“3”,“model”:“SDFVR-U34R”}]

namespace Antenna
{
    public static class Rfds
    {
        public class Antenna
        {
            public AntennaItems[] root { get; set; }
        }
        public class AntennaItems
        {
            public int sector { get; set; }
            public int position { get; set; }
            public int qty { get; set; }
            public string model { get; set; }
        }

[FunctionName("AntennaSort")]
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");

string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

var jsonexample = requestBody;

var jsonObj = JsonConvert.DeserializeObject<List<AntennaItems>>(requestBody);

List<string> ModelList = new List<string>();

foreach (var item in jsonObj)
{
    if (item.model != "" && item.model != null)
    {
     ModelList.Add(item.model);
     ModelList.Add(item.qty);
     }
}

var ModelAndCount = ModelList.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Sum());
//var ModelAndCount = ModelList.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count());

return new OkObjectResult(ModelAndCount);

            }
        }
    }
答案

你在这里发出谎言

 ModelList.Add(item.qty);

Qty是一个int,你试图将它添加到String Collection。考虑到你的最终目标是创建ModelAndCount Dictionary,你可以直接查询jsonObj Collection,而不是创建一个中间集合然后查询它。

假设您要按模型分组,您可以执行以下操作

var ModelAndCount = jsonObj.Where(x=> !string.IsNullOrEmpty(x.model))
                           .GroupBy(x=>x.model)
                           .ToDictionary(k=>k.Key,v=>v.Sum(x=>x.qty)); 

产量

enter image description here

另一答案

这是一个简单的代码,将GroupBy每个模型的数据和Sum的数量。像this

而不是创建一个空列表,然后进入foreach检查模型值。我们可以使用LinQ Where子句和IsNullOrWhiteSpace简单地过滤它们。

然后用一个简单的组我们可以计算总和。这里的结果将是一个匿名类。

public static void Run()
{
    //Data Initilisation
    var data = new[] {
        new DataItem{ model="a" , qty=1},
        new DataItem{ model="a" , qty=41},
        new DataItem{ model="b" , qty=12},
        new DataItem{ model="c" , qty=17},
    };
    var jsonData = JsonConvert.SerializeObject(data);


    // Process
    var jsonObj = JsonConvert.DeserializeObject<List<DataItem>>(jsonData);

    var result = jsonObj.Where(x => !string.IsNullOrWhiteSpace(x.model))
                        .GroupBy(x => x.model)
                        .Select(x => new { model = x.Key, sum = x.Sum(y => y.qty) })
                        .ToList();


}

public class DataItem
{
    public int qty { get; set; }
    public string model { get; set; }
}

结果:

model: a               sum: 42
model: b               sum: 12
model: c               sum: 17

以上是关于2个元素(项目和数量)的列表,在Group By中获得SUM的问题的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中的group by要怎么用!!

SQL中Group By的使用

SQL中Group By的使用

SQL中Group By的使用

MYSQL:SQL中Group By的使用

LINQ:从列表中选择项目(Group By/Select/Sum & Max!)