我有一个包含大量日期的数据表。我想按日期对这些进行分组,并给每一行计算一次。
我设法通过以下方式做到了这一点:
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能够引用其中的值是什么类型!
所以我的问题是如何通过类似上面的方式检索每一行的每个日期和计数?
我希望这是有道理的!
答案 0 :(得分:1)
我博客上的这个链接可以帮到你 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”声明您的“查询”变量,如上所示。
答案 1 :(得分:0)
我猜您无法访问匿名类的属性,因为您正在使用IEnumerable query = ...
。请改为 var query = ...
。
答案 2 :(得分:0)
通过你的评论&#34;我从函数&#34;返回查询,我认为你想要在方法中进行查询,将数据返回给调用者,然后迭代调用者中的数据,我建议您返回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
}