2016-05-27 39 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();