【问题标题】:Getting a count of rows in a datatable that meet certain criteria获取数据表中满足特定条件的行数
【发布时间】:2011-07-12 07:06:11
【问题描述】:

我有一个数据表 dtFoo,并且想要获取满足特定条件的行数。

编辑:此数据未存储在数据库中,因此不能使用 SQL。

过去,我使用以下两种方法来完成此操作:

方法一

int numberOfRecords = 0;
DataRow[] rows;

rows = dtFoo.Select("IsActive = 'Y'");
numberOfRecords = rows.Length;

Console.WriteLine("Count: " + numberOfRecords.ToString());

方法二

int numberOfRecords = 0;

foreach (DataRow row in dtFoo.Rows)
{
    if (row["IsActive"].ToString() == "Y")
    {
        numberOfRecords++;
    }
}

Console.WriteLine("Count: " + numberOfRecords.ToString());

我的商店正在尝试对一些事情进行标准化,这是已经出现的一个问题。我想知道这些方法中哪种方法在性能方面最好(为什么!),以及哪种方法最常用。

另外,有没有更好的方法来达到预期的结果?

【问题讨论】:

    标签: c# datatable count criteria


    【解决方案1】:

    实现此目的的一种简单方法是将原始帖子中发布的内容合并到一个声明中:

    int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Length;
    

    实现此目的的另一种方法是使用 Linq 方法:

    int numberOfRecords = dtFoo.AsEnumerable().Where(x => x["IsActive"].ToString() == "Y").ToList().Count;
    

    请注意,这需要包含System.Linq。

    【讨论】:

    • 优秀的解决方案,您能否告诉我一些可以查看许多 LINQ 示例的来源?
    • @Saluce, dtFoo.AsEnumerable().Where(expr) 不需要转换为可枚举,因为我们可以使用 dtFoo.Where(expr) 也已经是可枚举的
    • @Sunny_Sid 这不正确。您必须显式转换为 Enumerable 才能使用 Enumerable.Where。
    【解决方案2】:
    int numberOfRecords = DTb.Rows.Count;
    int numberOfColumns = DTb.Columns.Count;
    

    【讨论】:

      【解决方案3】:

      不确定这是否更快,但至少更短:)

      int rows = new DataView(dtFoo, "IsActive = 'Y'", "IsActive",
          DataViewRowState.CurrentRows).Table.Rows.Count;
      

      【讨论】:

      • int rows = new DataView(dtFoo, "IsActive = 'Y'", "IsActive", DataViewRowState.CurrentRows).Table.Rows.Count; 比int rows = dtFoo.Select("IsActive = 'Y'").Length; 短多少?
      • @PedroC88:不是;它比原始海报的方法要短。
      【解决方案4】:
      int numberOfRecords = 0;
      
      numberOfRecords = dtFoo.Select().Length;
      
      MessageBox.Show(numberOfRecords.ToString());
      

      【讨论】:

      • @Sesame 已经描述了有问题的 dtFoo.Select 方法。此外,问题是关于按某些标准进行计数,而不是检索记录总数。
      【解决方案5】:

      试试这个

      int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Count<DataRow>();    
      Console.WriteLine("Count: " + numberOfRecords.ToString());
      

      【讨论】:

        【解决方案6】:
        int row_count = dt.Rows.Count;
        

        【讨论】:

          【解决方案7】:

          如果数据存储在数据库中,将查询发送到数据库会更快,而不是获取所有数据并在内存中查询。

          第三种方法是 linq to datasets,但我怀疑这三种方法中的任何一种在性能上都有很大差异。

          【讨论】:

          • 此数据未存储在数据库中。我编辑了我的原始条目以反映这一点。
          【解决方案8】:
          object count =dtFoo.Compute("count(IsActive)", "IsActive='Y'");
          

          【讨论】:

            猜你喜欢
            • 2016-09-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-05
            • 2011-12-28
            • 2013-09-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多