获取数据表中满足特定条件的行数

Posted

技术标签:

【中文标题】获取数据表中满足特定条件的行数【英文标题】: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());

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

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

【问题讨论】:

【参考方案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'");

【讨论】:

以上是关于获取数据表中满足特定条件的行数的主要内容,如果未能解决你的问题,请参考以下文章

如何根据数据框中的列值获取特定的行数[重复]

熊猫以时间为索引获取特定日期的行数

当数据的行数多于替换项时,如何替换按特定条件分组的所有数据行?

汇总数据

获取二维数组里面实际存有数据的行数

快速回顾MySQL:汇总和分组