在 C# 中使用条件遍历行时,如何让数据表检测多列?

How can I have a datatable detect multiple columns when iterating through rows in C# with conditionals?

我是 C# 的新手,我必须将 JavaScript 程序重新构建到 C# 中。

此程序涉及读取 CSV 文件并遍历它以检测不同的值并生成输出。

这是我的代码示例:

foreach(DataRow row in results.Rows)
{
    if (row["Date"].ToString().Substring(row["Date"].ToString().Length - 16) == "2021 12:00:00 AM") //Checks if the year is 2021 or not in the "date" column
    {
        if (row["State"].ToString() == "CA") //Looks for CA state in the "state" column, however, it appears to not be finding it?
        { //DOES NEEDED CALCULATIONS

基本上,代码在数据 table 中检测到“2021”日期就好了,但是在遍历行时根本找不到 CA 状态,因此,所需的计算永远不会完成。

这是数据 table 的样子: DataTable

非常感谢您的帮助,由于我对 C# 缺乏了解,我在这上面停留了一段时间。

很可能 row["State"]

中有一些额外的空格

试试这个:

foreach(DataRow row in results.Rows)
{
    if (row["Date"].ToString().Substring(row["Date"].ToString().Length - 16) == "2021 12:00:00 AM") //Checks if the year is 2021 or not in the "date" column
    {
        if (row["State"].ToString().Contains("CA")) //Looks for CA state in the "state" column, however, it appears to not be finding it?
        { //DOES NEEDED CALCULATIONS

话虽如此,之前的所有评论对您的需求确实很有帮助。如果不需要,请不要进行自己的 CSV 解析。不要像 string 那样在 DateTime 上工作。制作您自己的 DTO 来表示记录,而不是使用 DataTable.

示例:

record Invoice
{
    public int InvoiceNumber { get; set; }
    public DateTime Date { get; set; }
    public double Amount { get; set; }
    public string State { get; set; }
}

public void DoStuff()
{
    var invoices = ReadInvoiceFile("Your/Path/Here.csv");
    foreach (var invoice in invoices)
    {
        if(invoice.Date.Year != 2021) continue;
        if (invoice.State.Contains("CA"))
        {
            //do CA specific stuff here
        }
    }
}

private List<Invoice> ReadInvoiceFile(string path)
{
    //realistically you would use a 3rd party library to do this
}

我还要补充一点,您不应在代码中使用内联文字(例如我的示例中的 2021"CA")。让你的行为依赖于围绕硬编码状态和年份的 if 语句违反了开放-封闭原则,并且是重构为工厂方法的良好候选者。但是让我们一步一个脚印。