【问题标题】:List of 2 elements (item & quantity), Issues getting SUM in the GroupBy2 个元素的列表(项目和数量),在 Group By 中获取 SUM 的问题
【发布时间】:2019-01-24 10:01:06
【问题描述】:

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

[{“扇区”:“3”,“位置”:“3”,“数量”:“1”,“型号”:“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);

            }
        }
    }

【问题讨论】:

  • 向我们展示AntennaItems类的代码
  • @Fabjan,代码块中的 2 个元素。
  • 我怀疑您可以简化此代码,使其成为minimal reproducible example。例如删除 streamReader 并在字符串常量中定义 JSON 值。 这里的关键是让我们可以将它复制并粘贴到控制台应用程序中并运行它——它应该是完全独立的。
  • 那么 ModelList 是一个字符串列表,而 item.qty 是一个 int。你也许想要ModelList.Add(item.qty.ToString());?虽然这似乎有点可疑。
  • 您对 ModelAndCount 有什么期望?你每个模型的数量总和是多少?模型出现的次数?

标签: c# json linq


【解决方案1】:

你的问题就在这里

 ModelList.Add(item.qty);

Qty 是一个 int 并且您正在尝试将其添加到 String Collection。考虑到您的最终目标是创建 ModelAndCount 字典,您可以直接查询 jsonObj 集合,而不是创建中间集合然后查询它。

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

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

输出

【讨论】:

  • 做到了。我只需要更改 qty 以允许 null 值,它工作得很好!感谢大家的帮助!!!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多