在 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 语句违反了开放-封闭原则,并且是重构为工厂方法的良好候选者。但是让我们一步一个脚印。
我是 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 语句违反了开放-封闭原则,并且是重构为工厂方法的良好候选者。但是让我们一步一个脚印。