【问题标题】:Find amount of rows in a data table without looping C#在不循环 C# 的情况下查找数据表中的行数
【发布时间】:2016-01-14 13:38:44
【问题描述】:

我目前有一段可以正常工作的代码,如下所示:

 foreach (DataRow dr in dt.Rows)
            {
                if ((int)dr["StatusId"] == 1)
                {
                  count += 1;

                }

            }

然后,我使用 count 作为新数组的长度创建一个数组,并循环返回一个相同的循环以填充数组。有没有一种方法可以让我在不创建原始循环的情况下获取数据表中的行数,以便我可以清理一些代码?

【问题讨论】:

  • 给 'Rows.Count' 一个机会 --- 添加为答案
  • @nabuchodonossor 循环中有一个 if
  • icount int = dt.Rows.Count
  • 你想要所有行的计数吗?或者只是状态为 1 的行?
  • @nabuchodonossor:如果 StatusId == 0, Rows.Count 会将该行计入怎么办?

标签: c# asp.net arrays datatable


【解决方案1】:

如果您只想计算表中所有行的计数,dt.Rows.Count 可以解决问题。

但是,如果您需要查询StatusId 的值并且只计算StatusId == 1 时的行,那么您将需要以某种方式循环行。您可以使用 Linq 执行此操作并避免手动编写循环:

var count = dt.AsEnumerable().Count(r => r.Field<int>("StatusId") == 1);

【讨论】:

    【解决方案2】:

    这里作为答案@erikscandola: if 显然要省略,您不需要计算...

      Rows.Count
    

    【讨论】:

    • 您只需要计算 StatusId 等于 1 的行数。无论StatusId 的值如何,您的解决方案都会返回总行数。
    【解决方案3】:

    如果您想要 StatusId = 1 的行数,您可以使用 Linq:

    public void Test()
    {
        DataTable dt = new DataTable();
    
        int count = (from DataRow dr
                    in dt.Rows
                     where (int)dr["StatusId"] == 1
                     select dr
                    ).Count();
    
        //on one line
        int count = (from DataRow dr in dt.Rows where (int)dr["StatusId"] == 1 select dr).Count();
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用 linq 功能来执行此操作。在您的示例中,我注意到您尝试使用条件计算“StatusId”列。统计具体条件可以使用下面的方法。

      DataTable myDataTable = new DataTable();
      int countOfCondition = myDataTable.AsEnumerable().Where(x => x.Field<int>("StatusId") == 1).Count();
      

      【讨论】:

        【解决方案5】:

        Soo...如果我正确阅读了您的问题,您不是在寻找一种计算行数的方法,而是在寻找一种方法来获得与您的标准匹配的行数组?

        试试这个:

        DataRow[] result = dt.Select("StatusId = 1");
        

        Select 方法选择与您的条件匹配的所有行并返回所选行的数组。

        另请参阅:https://msdn.microsoft.com/en-us/library/det4aw50(v=vs.110).aspx

        【讨论】:

        • 这个答案能够在一行中完全消除我的两个循环 - 非常甜蜜。
        【解决方案6】:

        rows.Length 或 rows.Count 应该可以工作。

        【讨论】:

          【解决方案7】:

          您需要使用AsEnumerable 扩展,然后使用 where 仅获取 StatusId 等于 1 的行。之后使用 Count 获取结果数。

          dt.AsEnumerable().Where(dr => (int)dr["StatusId"] == 1).Count();
          

          【讨论】:

            猜你喜欢
            • 2019-08-10
            • 2013-09-20
            • 2016-02-16
            • 1970-01-01
            • 2014-04-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多