【问题标题】:C# split array in groups of 30 then call apiC# 以 30 个为一组拆分数组,然后调用 api
【发布时间】:2020-11-06 15:09:30
【问题描述】:

我想寻求有关循环的帮助。

我的方法接收一个带有姓名和电子邮件地址的 JSON 字符串,它使用这个对象字符串传递给外部 API POST 请求。

我刚刚发现 API 一次只能处理 30 个项目,否则无法验证。

我想学习如何检查json字符串是否包含超过30个项目,如果是,则在调用api时一次处理30个项目。是否有可能获得该循环的示例?

我的方法目前执行以下步骤:

public ActionResult CreatePanelists(Parameters data)
{
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

    var webId = data.webId;
    var jwt_token = JWTToken.GetJWTToken();
    var panelists = JsonConvert.SerializeObject(data.panelists);   <- this is the array
    var client = new RestClient($"https://api/{webId}/panelists");
    var request = new RestRequest(Method.POST);

    request.AddHeader("content-type", "application/json");
    request.AddHeader("authorization", $"Bearer {jwt_token}");
    request.AddParameter("application/json", $"{{\"panelists\": {panelists}}}", ParameterType.RequestBody);
    IRestResponse response = client.Execute(request);

    return new JsonResult { Data = new { status = response.StatusCode, message = response.Content} };

}

任何帮助都会很棒。

非常感谢。

更新

我添加了示例代码,发现一些错误:

'index': a parameter or local variable cannot have the same name as a method type parameter

Syntax error, '=>' expected

Invalid expression term ')'

'item': a parameter or local variable cannot have the same name as a method type parameter

更新2

return 部分现在在抱怨,response 在循环中,return 无法访问

The name response does not exists in the current context.

return new JsonResult { Data = new { status = response.StatusCode, message = response.Content} };

UPDATE3

public ActionResult CreatePanelists(Parameters data)
{
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

    var results = new List<string>();
    var webId = data.webId;
    var jwt_token = JWTToken.GetJWTToken();
    
    var batches = data.panelists
        .Select((item, index) => new { item, index })
        .GroupBy(t => t.index / 30)
        .Select(g => g.Select(t => t.item))
        .Select(batch => JsonConvert.SerializeObject(batch));

    foreach (var batch in batches)
    {
        var client = new RestClient($"https://api/meetings/{webId}/panelists");
        var request = new RestRequest(Method.POST);

        request.AddHeader("content-type", "application/json");
        request.AddHeader("authorization", $"Bearer {jwt_token}");
        request.AddParameter("application/json", $"{{\"panelists\": {batch}}}", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);
        string JSON = JsonConvert.SerializeObject(response);
        
        results.AddItem(JSON);
    }

    return new JsonResult { Data = results };

添加项目:

    public static void AddItem<T>(this List<T> list, T item)
    {
        if (!list.Contains(item))
        {
            list.Add(item);
        }
    }

如果您对如何改进代码有任何建议,请告诉我

【问题讨论】:

  • 您说您有接收 JSON 字符串的代码。但是您已经发布了创建 JSON 字符串的代码。它是哪一个?您只是在问如何检查data.panelists 的元素数量吗?

标签: c# arrays asp.net-mvc loops


【解决方案1】:

例如,您可以使用 LINQ:

var batches = data.panelists
    .Select((item, index) => (item, index))
    .GroupBy(t => t.index/30)
    .Select(g => g.Select(t => t.item))
    .Select(batch => JsonConvert.SerializeObject(batch));

foreach (var batch in batches)
{
    var request = new RestRequest(Method.POST);
    request.AddHeader("content-type", "application/json");
    request.AddHeader("authorization", $"Bearer {jwt_token}");
    request.AddParameter("application/json", $"{{\"panelists\": {batch}}}", ParameterType.RequestBody);
    IRestResponse response = client.Execute(request); // somehow process/join the result
}

【讨论】:

  • 您好@Guru Stron - 我添加了您的示例,但出现了一些错误:'index': a parameter or local variable cannot have the same name as a method type parameter 语法错误,'=> 'expect Invalid expression term ')' 'item': 参数或局部变量不能与方法类型参数同名
  • @erasmocarlos 您使用的是什么版本的 C#?这是works fine 给我的。尝试将第一个选择更改为.Select((item, index) =&gt; new {item, index})。并尝试将 itemindex 重命名为其他名称。
  • 我正在使用 VS 2015 .NET Framework 4.5.2 - 让我试试你推荐的,然后报告。
  • 你能看看我最近的更新吗?我收到一个新错误
  • @erasmocarlos 是的,这就是为什么我在我的代码中有评论 somehow process/join the result
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多