这可能很琐碎,但我不能得到它的工作(LINQ级新手)。linq groupby()和Sum()
我想为同一天的客户端(日期显示在epoc/unixtime中)对行进行分组和总计。
目前它只显示最大值为21(从Kbytes转换为Gbytes),而不是±26,这是我想看到的。
如何添加GroupBy
和Sum
子句来为每天添加Kbytes?
public class Images
{
public string ClientName { get; set; }
public string ImageID { get; set; }
public int PolicyType { get; set; }
public int ScheduleType { get; set; }
public Int64 BackupTime { get; set; }
public Int64 KBytes { get; set; }
}
和
public static List<Images> images = new List<Images>();
和
public void calc()
{
foreach (var client in clients)
{
totalmax = 0;
totalavg = 0;
foreach (var ptype in ptypes)
{
var windowsquery = images
.Where(s => s.PolicyType == Convert.ToInt16(ptype) && s.ScheduleType == 0 && s.ClientName == client)
.Select(s => s.KBytes);
double typemax = windowsquery.DefaultIfEmpty().Max()/1048576;
totalmax = Math.Round(totalmax + typemax);
double typeavg = windowsquery.DefaultIfEmpty().Average()/1048576;
totalavg = Math.Round(totalavg + typeavg);
}
Console.WriteLine("Client = {0}, Max = {1}, Ave = {2}", client,totalmax, totalavg);
Console.ReadKey();
}
}
输出继电器(省略了来自输出的其他客户端)
客户=客户机2,最大值= 21,平均= 14
更新:实施t他的
var summary = (from image in images
where image.ScheduleType == 0
group image by new
{
image.ClientName,
image.PolicyType,
image.ScheduleType,
BackupDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0)
.AddSeconds(image.BackupTime)
.ToString("yyyy-MM-dd")
} into imageGroup
select new
{
ClientName = imageGroup.Key.ClientName,
PolicyType = imageGroup.Key.PolicyType,
BakupDateTime = imageGroup.Key.BackupDateTime,
SumGBytes = imageGroup.Sum(s => s.KBytes)/1048576.0,
AvgGBytes = imageGroup.Average(s => s.KBytes)/1048576.0,
}
).ToList();
但总和是不正确的,平均工作正常。
此输入是否包含Client1和Client2的所有记录?如果是这样,则Client2的最大值为〜21,而不是〜26。你为什么期望26? – PiKos
是的,这个样本输入是正确的。因为日期(1463234422&1463234420)在同一天。我想要一天的总和sum'd –
好吧,你是对的,我以前没有注意到这一点。 – PiKos