【问题标题】:C# Count if Field Exists如果字段存在,C# 计数
【发布时间】:2019-08-16 21:13:33
【问题描述】:

下面是一个执行 API 调用的脚本,它检索一些 ReportID(从数据库表中),将它们传递给一个单独运行它们的方法,最后查看每个是否包含字段 Name_First。

我需要帮助的是创建一个计数,它会告诉我有多少报告包含字段 Name_First,有多少不包含字段,以及在所有报告中包含字段 Name_First 的百分比是多少。

目前,该脚本会查询两个 ReportID (12300,12301) 进行测试。一份报告中包含字段 Name_First,而另一份则没有。从我编写的 foreach 循环中,我的目标是计算每次有空值和每次没有空值时,得到一个总数,然后将非空值除以两者的总和。但是,当我运行此脚本时,控制台位于

                Console.WriteLine(total);
                Console.WriteLine(total_noFirstName);
                Console.WriteLine(total_FirstName);

返回值 0、0 和 0。我认为我在这里遇到了范围问题,但我不太确定。如果我能得到一些帮助来解决这个问题,我将非常感激。

谢谢!


using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;

namespace NameFirstSearch
{
   class Program
{

    static void Main(string[] args)
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

        const string username = "Username";
        const string password = "Password";



        const string baseUrl = "https://test.com/rest/services/";


        const string queryString = "query?q=Select * From Report Where ReportID in (12300,12301)";
        const string queryNameFirst = "getreport/";

        var client = new HttpClient();

        client.BaseAddress = new Uri(baseUrl);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var auth = Convert.ToBase64String(Encoding.Default.GetBytes(username + ":" + password));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", auth);

        //GetReports(client, queryString).Wait();
        var  reportsList = GetReports(client, queryString).Result;
        GetNameFirst(client, queryNameFirst, reportsList).Wait();

        Console.ReadLine();

    }



    static async Task<List<Properties>> GetReports(HttpClient client, string queryString)
    {

        List<Properties> result = new List<Properties>();

        var response = await client.GetAsync(queryString);

        // Check for a successfull result
        if (response.IsSuccessStatusCode)
        {
            var json = await response.Content.ReadAsStringAsync();

            result = JsonConvert.DeserializeObject<List<Properties>>(json);
        }
        else
        {
            // Error code returned
            Console.WriteLine("No records found on first method.");
        }

        return result;

    }


    static async Task GetNameFirst(HttpClient client, string queryNameFirst, List<Properties> results)
    {
        string reportType = ".json";

        foreach (var item in results)
        {
            var output = await client.GetAsync(queryNameFirst + item.ReportID + reportType);


            if (output.IsSuccessStatusCode)
            {
                var allText = await output.Content.ReadAsStringAsync();

                var fields = JsonConvert.DeserializeObject<List<FirstName>>(allText);

                var test = JsonConvert.SerializeObject(fields);

                Console.WriteLine(test);

                int total_FirstName = 0;
                int total_noFirstName = 0;
                int total = total_FirstName + total_noFirstName;
                foreach (var split in fields)
                {

                    if (split.Name_First != null)
                    {
                        total_FirstName++;

                    }
                    else if (split.Name_First == null)
                    {

                        total_noFirstName++;

                    }

                }
                Console.WriteLine(total);
                Console.WriteLine(total_noFirstName);
                Console.WriteLine(total_FirstName);

            }
            else
            {
                // Error code returned
                Console.WriteLine("No records found on second method.");
            }

        }

    }



}
}

类属性

int ReportID {get; set;}

类名

string Name_First {get; set;}

Console.WriteLine(test) 处的结果;

 [{"Name_First":"Mario"}]
 [{"Name_First":null}]

Console.WriteLine(allText);的结果

 [{"Name_First":"Mario","Entry_ID":"72313"}]
 [{"Name_Last":"Rincon Recio","Entry_ID":"72313"}]

【问题讨论】:

  • 这是一个一流的 SQL 漏洞。它几乎不能称为 SQL“注入”,因为无需使用任何注入技巧就可以提供完整的有害查询。
  • 好吧,total 总是为零,因为您将其设置为 0+0
  • 我相信像这样新建一个 HttpClient 并不是最佳实践。请参阅Microsoft docs 了解他们的建议。
  • 我建议使用 Linq 而不是编写自己的代码。它有一个计数方法可以满足您的需求。-docs.microsoft.com/en-us/dotnet/api/…
  • 好的,我现在明白了。 results 中的每个列表都只有一项。您应该在开始时在结果循环之外声明和初始化total_FirstNametotal_noFirstName。每次通过循环时,您都将它们设置为零。同样,在底部的循环外声明total 并求和,然后打印出值。

标签: c# visual-studio


【解决方案1】:

如果你想在一个循环中保持计数,你需要在循环之外声明计数器变量,否则它们会被重新初始化。使用问题中的数据,相关循环应如下所示:

    List<string> allTexts = new List<string>
    { @"[{""Name_First"":""Mario"",""Entry_ID"":""72313""}]",
      @"[{""Name_Last"":""Rincon Recio"",""Entry_ID"":""72313""}]" };

    int total_FirstName = 0;
    int total_noFirstName = 0;

    foreach(var allText in allTexts)
    {
        var fields = JsonConvert.DeserializeObject<List<FirstName>>(allText);
        var test = JsonConvert.SerializeObject(fields);
        Console.WriteLine(test);

        foreach (var split in fields)
        {
            if (split.Name_First != null)
            {
                total_FirstName++;
            }
            else
            {
                total_noFirstName++;
            }
        }
    }
    int total = total_FirstName + total_noFirstName;
    Console.WriteLine(total);
    Console.WriteLine(total_noFirstName);
    Console.WriteLine(total_FirstName);

输出:

 [{"Name_First":"Mario"}]
 [{"Name_First":null}]
 2
 1
 1

【讨论】:

  • 很抱歉没有与您联系。我能够将您最初在评论部分发布的内容应用到我的代码中。本质上,你上面提供的就是我所做的。我现在从这个测试场景中得到了想要的结果(总数为 2,total_FirstName 为 1,百分比值为 0.5)。我忘记回复了,因为我太兴奋了,我开始运行现在针对所有报告 (1620) 而不是仅针对这两个报告的脚本。遗憾的是,由于我在中途遇到任务错误,因此我无法让脚本运行所有这些,我正在尝试思考如何去做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2021-07-29
  • 1970-01-01
相关资源
最近更新 更多