【问题标题】:Loop through rows DataTable in C# and update variables循环遍历 C# 中的行 DataTable 并更新变量
【发布时间】:2018-07-02 08:52:59
【问题描述】:

我试图在 c# 中循环一个 DataTable 并从单元格中获取值。根据选择的月数,收到的数据可能看起来像这样。

Total   Year    Month   TypeId
466     2018    1       1
77      2018    1       2
471     2018    2       1
58      2018    2       2
459     2018    3       1
151     2018    3       2

第 1 个月等于 1 月。我将如何根据输入的日期拆分这些数据,所以如果有人正在寻找 3 月份的数据,我想将 3 月份的总数加起来 (459 + 151)

这是我现在的代码。

                    if (ds.Tables.Count > 0)
                    {

                        foreach (DataTable table in ds.Tables)
                        {
                            foreach (DataRow row in table.Rows)
                            {                                    
                                result.Total = Convert.ToInt32(ds.Tables[0].Rows[0]["Total"]);

                            }
                        }
}

【问题讨论】:

  • 您的代码似乎效率很低。 SQL 版本可能是更好的选择。
  • DataSet 中是否不止一个 DataTable?您是否尝试过 dataTable.Select() 方法来过滤数据?
  • 我同意@MaciejLos 发出第二个 SQL 命令来完成这个简单的操作会更加直接和快捷。

标签: c# sql loops datatable


【解决方案1】:

您正在遍历所有表的行,但您始终使用第一个表的第一行。这显然会给你错误的结果。您必须使用当前行的值。如果您只想包含 March 值,则需要跳过所有其他行:

if (ds.Tables.Count > 0)
{
    foreach (DataTable table in ds.Tables)
    {
        foreach (DataRow row in table.Rows)
        {                                    
            if (Convert.ToInt32(row["Month"]) != 3)
            {
                continue;
            }
            result.Total = Convert.ToInt32(row["Total"]);
        }
    }
}

请注意,这假定数据集中的所有表都至少有一个“月份”和一个“总计”列。大多数现实世界的数据集都不是这样的。由于您没有向我们展示数据集,因此我假设这实际上是底层结构。

【讨论】:

  • 好的,我知道我只是用 Rows[0] 返回一个值,所以如果我不知道用户将选择几月份,我将如何拆分数据。
  • 我想按月和年分割数据?
【解决方案2】:

使用下面来获得三月的总和。

int sum = Convert.ToInt32(dt1.Compute("SUM(Total)", "Month = 3"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2018-05-26
    相关资源
    最近更新 更多