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

时间:2019-01-24 10:01:06

标签: c# json linq

我有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);

            }
        }
    }

2 个答案:

答案 0 :(得分:1)

您的问题就在这里

 ModelList.Add(item.qty);

Qty是一个整数,您正试图将其添加到String Collection。考虑到最终目标是创建ModelAndCount字典,您可以直接查询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

答案 1 :(得分:0)

这是一个简单的代码,它将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