2011-03-09 212 views
29

我有一个数据表dtFoo,并希望获得满足特定条件的行数。获取数据表中符合特定条件的行数

编辑:此数据不存储在数据库中,因此使用SQL不是一个选项。

在过去,我用以下两种方法来实现:

方法1

int numberOfRecords = 0; 
DataRow[] rows; 

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

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

方法2

int numberOfRecords = 0; 

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

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

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

另外,是否有更好的方法来达到预期的效果?

回答

50

一个简单的方法来完成这个合并什么被张贴在原岗位到一个单一的语句:

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

另一种方式来完成,这是使用LINQ方法:

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

注意这需要包括System.Linq

+1

优秀的解决方案,你可以让我知道一些来源,我可以看到许多LINQ的例子吗? – 2014-03-29 14:21:27

+0

@Saluce,dtFoo.AsEnumerable()。where(expr)does not need to convert enumerable as we can use dtFoo.Where(expr)is already enumerable – 2015-07-14 11:53:54

+1

@Sunny_Sid这是不正确的。你必须明确地转换为'Enumerable'来使用'Enumerable.Where'。 – saluce 2015-10-08 13:58:22

0

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

做到这一点的第三种方法是LINQ到数据集,但我怀疑这三种方法在性能上差异很大。

+0

此数据不存储在数据库中。我编辑了我的原始条目以反映这一点。 – Sesame 2011-03-10 16:37:22

2

不知道这是快,但至少它的短:)

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

int rows = new DataView(dtFoo,“IsActive ='Y'”,“IsActive”, DataViewRowState.CurrentRows).Table.Rows.Count;'short than'int rows = dtFoo.Select(“IsActive = 'Y'“)长度。'? – PedroC88 2013-07-04 05:15:59

+0

@ PedroC88:不是;它比原始海报的方法短。 – Cosmin 2013-07-04 09:42:56

3
int numberOfRecords = 0; 

numberOfRecords = dtFoo.Select().Length; 

MessageBox.Show(numberOfRecords.ToString()); 
+2

@Sesame已经描述过dtFoo.Select方法。此外,问题是关于按某些标准计算,而不是检索记录总数。 – Alexander 2014-04-30 12:48:10

+0

对我有帮助谢谢 – 2016-03-28 04:40:03

0
object count =dtFoo.Compute("count(IsActive)", "IsActive='Y'"); 
5
int numberOfRecords = DTb.Rows.Count; 
int numberOfColumns = DTb.Columns.Count; 
1

试试这个

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