[英]Retrieving values from a Linq GroupBy
我有一個包含大量日期的數據表。 我想按日期對這些進行分組,並給每一行計算一次。
我設法通過以下方式做到了這一點:
IEnumerable query = from row in stats.AsEnumerable()
group row by row.Field<string>("date") into grp
select new { Date = grp.Key, Count = grp.Count(t => t["date"] != null) };
(其中“stats”是數據表)
我可以從調試中看到,這會帶回所有按需要分組的值,但現在我需要循環它們並獲取每個日期和計數。
我的問題是我不知道如何檢索值!
我有一個foreach循環
foreach (var rw in query)
{
string date = rw.Date; // <---- this is my problem?
}
我不知道我的Ienumerable是什么類型可以引用它中的值!
所以我的問題是如何通過類似上面的方式檢索每一行的每個日期和計數?
我希望這是有道理的!
我博客上的這個鏈接可以幫助您http://www.matlus.com/linq-group-by-finding-duplicates/
基本上您的類型是匿名類型,因此您不能將其作為類型引用,但您可以像訪問一樣訪問屬性。
我想我看到了你的問題。 如果您嘗試從方法返回它,您應該定義一個類型並重新啟動它,如下所示:
public IEnumerable<MyType> GetQuery()
{
var query = from row in stats.AsEnumerable()
group row by row.Field<string>("date") into grp
select new { Date = grp.Key, Count = grp.Count(t => t["date"] != null) };
foreach (var rw in query)
{
yield return new MyType(rw.Date, rw.Count);
}
}
使用“var”聲明您的“查詢”變量,如上所示。
我猜你沒有訪問匿名類的屬性,因為你正在使用IEnumerable query = ...
嘗試var query = ...
而不是。
通過你的評論“我從一個函數返回查詢”,我認為這意味着你想在一個方法中進行查詢,將數據返回給調用者,然后在調用者中迭代數據,我建議你返回一個Dictionary<DateTime, int>
,如下所示:
static Dictionary<DateTime, int> GetSummarisedData()
{
var results = (
from row in stats.AsEnumerable()
group row by row.Field<string>("date") into grp
select new { Date = grp.Key, Count = grp.Count(t => t["date"] != null) })
.ToDictionary(val => val.Date, val => val.Count);
return results;
}
然后在調用者你可以
foreach (var kvp in GetSummarisedData())
{
// Now kvp.Key is the date
// and kvp.Value is the count
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.