2016-05-27 13 views
-1

我想对数据表的列中的不同值进行计数。我发现这个有用的技术:在数据表中计算不同的非空行

count = dataTable.DefaultView.ToTable(true, "employeeid").rows.count 

如果有列没有空也能正常工作,但如果有,计数是一个高。 有没有办法从计数中消除空值行,或者我是否必须遍历结果表寻找可能的空值?

tbl = dataTable.DefaultView.ToTable(true,"employeeid") 
For Each row in tbl.rows 
... 
+0

我怀疑有点LINQ将帮助你在这里。如果不知道上面的每个部分的类型,我不能说哪里放置它,但可能在行和计数之间。 – ManoDestra

+0

@ManoDestra你是对的。有一些很棒的库,比如MoreLINQ,它可以帮助解决这样的问题。 – IdahoSixString

+0

虽然没有额外的库,但基本的LINQ就足够了。这里不需要它。 – ManoDestra

回答

2

您可能需要进入临时存储。我不知道的类型,但是这里的例子..

var dataview = new DataView(dataTable); 
dataview.RowFilter = "yourColumn != null"; 
var count = dataview.ToTable().Rows.Count; 
+0

谢谢大家。此解决方案完美工作,并将我介绍给RowFilter。这是我使用Visual Studio(VB.NET)的第2个月;我仍然有很多东西需要学习。 StackOverflow是最好的! – PaulWolt

0
DataTable table = new DataTable(); 
table.Columns.Add("employeeid", typeof(int)); 
table.Columns.Add("employeeid2", typeof(string)); 
table.Rows.Add(null, null); 
table.Rows.Add(100, "50"); 
table.Rows.Add(103, "50"); 
table.Rows.Add(101, "50"); 
table.Rows.Add(102, "52"); 


// This is if the column employeeid is a nullable value type 
var distinctCount = table.Rows.OfType<DataRow>().DistinctBy(x => x["employeeid"]).Count(x => x["employeeid"] != null); 


// This is if the column employeeid is a string type 
var distinctCount2 = table.Rows.OfType<DataRow>().DistinctBy(x => x["employeeid2"]).Count(x => !string.IsNullOrWhiteSpace(x["employeeid2"].ToString())); 

这是利用图书馆MoreLinq。你可以通过在你的包管理器控制台中运行这个包来获得这个包。

Install-Package morelinq -Version 1.4.0 
3

您可以在DataTable中投DataRow中收集到一个IEnumerable,然后使用标准的LINQ到过滤,分组,并计算组数。

myDataTable.Rows.Cast<DataRow>() 
      .Where(r => r.Field<int?>("EmployeeID").HasValue) 
      .GroupBy(r => r.Field<int?>("EmployeeID")) 
      .Count();