C# 按linq分组后无法保留属性
我收集了以下用法,需要以下输出: 这是我的用法类:C# 按linq分组后无法保留属性,c#,linq,group-by,C#,Linq,Group By,我收集了以下用法,需要以下输出: 这是我的用法类: public class Usage { public Usage() {} public string Alias { get; set; } public int ActivityCount { get; set; } public DateTime HitDate { get; set; } } 这是我的代码: 我想首先将集合分组为用户,对于每个用户,我想获得每天的点击次数,如下面的预期输出所示。请注
public class Usage
{
public Usage() {}
public string Alias { get; set; }
public int ActivityCount { get; set; }
public DateTime HitDate { get; set; }
}
这是我的代码:
我想首先将集合分组为用户,对于每个用户,我想获得每天的点击次数,如下面的预期输出所示。请注意,日期时间a和d是同一天中的不同时间,因此需要将它们分组在一起
我将用它来绘制点击率与日期的条形图,即每天点击率
执行此操作时,我无法将别名字段数据保留到第二级分组中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace NullOperator
{
class Program
{
static void Main(string[] args)
{
var a = new DateTime(2015, 10, 23, 12, 05, 06);
var b = new DateTime(2015, 10, 24, 12, 05, 06);
var c = new DateTime(2015, 10, 25, 12, 05, 06);
var d = new DateTime(2015, 10, 23, 14, 05, 06);
var usages = new List<Usage>
{
new Usage{Alias = "A ",HitDate = a},
new Usage{Alias = "A ",HitDate = a},
new Usage{Alias = "A ",HitDate = d},
new Usage{Alias = "A ",HitDate = b},
new Usage{Alias = "A ",HitDate = b},
new Usage{Alias = "A ",HitDate = b},
new Usage{Alias = "A ",HitDate = c},
new Usage{Alias = "B ",HitDate = a},
new Usage{Alias = "B ",HitDate = b},
new Usage{Alias = "B ",HitDate = b},
new Usage{Alias = "B ",HitDate = c},
new Usage{Alias = "B ",HitDate = c},
new Usage{Alias = "B ",HitDate = c},
new Usage{Alias = "C ",HitDate = a},
new Usage{Alias = "C ",HitDate = a},
new Usage{Alias = "C ",HitDate = a},
new Usage{Alias = "C ",HitDate = c},
new Usage{Alias = "C ",HitDate = c},
new Usage{Alias = "C ",HitDate = c},
};
var g = usages.GroupBy(r => r.Alias);
foreach (var u in g)
{
var x = u.GroupBy(r => r.HitDate.Day).Select(gr=>new
{
HitDate=gr.Key,
Count=gr.Count()
});
foreach (var m in x)
{
Console.WriteLine(m.HitDate + " " +m.Count);
}
}
Console.Read();
}
}
获得的产量:
23 3
24 3
25 1
23 1
24 2
25 3
23 3
25 3
正如您所看到的,分组是正常的,但是一些信息,如整个日期和别名都丢失了,我无法在嵌套循环的代码中检索它们
有什么建议吗?关于如何获得所需的输出?您也可以在select语句中选择该值
var g = usages.GroupBy(r => r.Alias);
foreach (var u in g)
{
var x = u.GroupBy(r => r.HitDate.Day)
.Select(gr => new {
Alias=u.Alias,
HitDate=gr.Key,
Count=gr.Count()
});
foreach (var m in x)
{
Console.WriteLine(m.HitDate + " " + m.Count);
}
}
这里基本上有两个问题:
- 您是按
分组的,而不是按日期
分组的,我怀疑您是否愿意这样做日期
- 您没有使用别名作为外部分组中的键这一事实
var query = usages.GroupBy(r => new { r.Alias, r.HitDate.Date },
(key, elements) => new { key.Alias,
key.Date,
Count = elements.Count() })
.OrderBy(x => x.Alias)
.ThenBy(x => x.Date);
foreach (var item in query)
{
Console.WriteLine("{0} {1} {2}", item.Alias, item.Date, item.Count);
}
除此之外,现在是学习自动实现属性的好时机-您的Usage类可以有一个3行长的主体…我知道,先生。我从一个需要更改属性的更大应用程序复制了这段代码。我删除了OnPropertyChanegd方法,但忘了在这里删除它。让我更新一下。@DaveZych:不,他们不会的-你明白
DateTime.Date
的作用吗a.Date
将等于d.Date
。我强烈怀疑“按天”实际上并不是指“按月的天数”,而这正是原始代码实际将要发生的事情——你相信OP会把11月1日的点击率与10月1日的点击率计算在同一组中吗?@DaveZych:啊,对,我同意你的看法。修正-我使用了DateTime的right属性,只是没有在DateTime:)我仍然不相信OP想要按DateTime.Day.works进行分组,就像一个魅力陛下:)。。我确实想按日期分组,而不是按天分组,没错!!elements.Count()之后只缺少一个}这是我首先尝试的intutivelyat,但对象u没有Alias属性。它在第一组中丢失了。
var query = usages.GroupBy(r => new { r.Alias, r.HitDate.Date },
(key, elements) => new { key.Alias,
key.Date,
Count = elements.Count() })
.OrderBy(x => x.Alias)
.ThenBy(x => x.Date);
foreach (var item in query)
{
Console.WriteLine("{0} {1} {2}", item.Alias, item.Date, item.Count);
}