2017-05-03 16 views
2

樣品的DataTable(UseDate列):如何使用LINQ分開列項和計數

Jun 2 2015 1:55PM 
Jun 2 2015 2:05PM 
Jul 3 2016 1:12PM 
Jul 4 2016 2:43AM 

我想使用LINQ來做到這一點,是最快的(作爲記錄會大大超過千更多)。

我見到目前爲止以下內容:

var dateAdded = dataTable.AsEnumerable() 
    .GroupBy(row => row.Field<String>("UseDate")) 
    .Select(grp => new { Date = grp.Key.ToString().Substring(0, grp.Key.LastIndexOf(' ')).Trim(), Count = grp.Key.ToString().Substring(0, grp.Key.LastIndexOf(' ')).Count() }); 

我得到以下幾點:

Date = "Jun 2 2015", Count = 6 
Date = "Jun 2 2015", Count = 6 
Date = "Jul 3 2016", Count = 4 
Date = "Jul 4 2016", Count = 4 

我不知道如何計數被要麼完成了。

我想知道上面的DataTable中每個日期的計數(例如Jun 2 2015)。

所以上面會告訴我:

Date = "Jun 2 2015", Count = 2 
Date = "Jul 3 2016", Count = 1 
Date = "Jul 4 2016", Count = 1 
+0

好像你想'Count = grp.Count()'。現在你要計算字符串中的字符,儘管它與結果不匹配。您還需要在截斷的日期進行分組。 – juharr

+1

數據表是鏈接到數據庫還是內存? –

+0

@juharr我不需要觸及'.Count()'方法,因爲它會計算'Data'部分中的任何內容? – Si8

回答

1

首先您需要在截斷的日期上進行分組,然後選擇該列,然後截斷它。然後你可以得到每個分組的計數。

var dateAdded = dataTable.AsEnumerable() 
    .Select(row => row.Field<String>("UseDate")) 
    .Select(fullDate => fullDate.Substring(0, fullDate.LastIndexOf(' ')).Trim()) 
    .GroupBy(truncatedDate => truncatedDate) 
    .Select(grp => new 
    { 
     Date = grp.Key, 
     Count = grp.Count() 
    }); 
+0

雖然這個工作是從'Select'中截取的'truncatedDate'?我幾乎接近:)。我沒有意識到'Count'並不需要被截斷。謝謝你的回答 – Si8

+0

我做了多重選擇以避免類似於GroupBy(row => row.Field (「UseDate」)。Substring(0,row.Field (「UseDate」)。LastIndexOf('')) .Trim())' – juharr

1

假設在數據庫中的DateTime格式始終就像你提到的,可以正確地使用這GroupBy。它首先解析datetime,然後按照Date部分進行分組。

var dateAdded = dataTable.AsEnumerable() 
    .GroupBy(row => DateTime.ParseExact(row.Field<String>("UseDate"), 
      "MMM d yyyy h:mmtt", CultureInfo.InvariantCulture).Date);