C# 如何选择按月分组的行
如何选择按月分组的行。C# 如何选择按月分组的行,c#,.net,linq,C#,.net,Linq,如何选择按月分组的行。 所以我有一个实体: public class Security { public Guid Id { get; set; } public string Name { get; set; } public string Quatation { get; set; } public SecurityType SecurityType { get; set; } public double Denomination { get;
所以我有一个实体:
public class Security
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Quatation { get; set; }
public SecurityType SecurityType { get; set; }
public double Denomination { get; set; }
public CurrencyType DemoniationType { get; set; }
public virtual ICollection<ReportPeriod> ReportPeriods { get; set; }
}
所以我需要以某种方式得到报告期内一年中每个月的总金额。有人知道怎么做吗?你想要一个月的总金额
- 假设您希望它的格式为
,其中字典
是月份的第一个日期(我们在哪个月的键
)值中有一般金额
- 假设如此,则
和开始
的范围不会跨越该月结束
安全性
类中添加此属性
public Dictionary<DateTime, double> AmountGroupedByMonth
{
get
{
Dictionary<DateTime, double> table = new Dictionary<DateTime, double>();
if (ReportPeriods != null && ReportPeriods.Count > 0)
{
ReportPeriod frtReportPeriod = ReportPeriods.First();
DateTime monthStDt =
new DateTime(frtReportPeriod.Start.Year, frtReportPeriod.Start.Month, 1);
double groupedAmount = 0;
foreach (ReportPeriod reportPeriod in ReportPeriods)
{
//Checking if this report should be grouped with pervious report or not
if (monthStDt.Year == reportPeriod.Start.Year
&& monthStDt.Month == reportPeriod.Start.Month)
{
groupedAmount += reportPeriod.Amount;
}
else
{
//if we find that this report is of different month.
table.Add(monthStDt, groupedAmount);
groupedAmount = reportPeriod.Amount;
monthStDt =
new DateTime(reportPeriod.Start.Year, reportPeriod.Start.Month, 1);
}
}
if (groupedAmount != 0 && !table.ContainsKey(monthStDt))
table.Add(monthStDt, groupedAmount);
}
return table;
}
}
输出将如下所示:
我们可以通过使用LINQ来实现这一点。请在C#中查找以下代码段。希望能有帮助。在这里,我们按年份和月份进行分组,然后对金额进行汇总
namespace Solutions
{
using System;
using System.Collections.Generic;
using System.Linq;
public class Security
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Quatation { get; set; }
//public SecurityType SecurityType { get; set; }
public double Denomination { get; set; }
//public CurrencyType DemoniationType { get; set; }
public virtual ICollection<ReportPeriod> ReportPeriods { get; set; }
}
public class ReportPeriod
{
public Guid Id { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public Guid SecurityId { get; set; }
public Guid StockExchangeId { get; set; }
public double Amount { get; set; }
public virtual Security Security { get; set; }
}
public class Entities
{
public static void Main(string[] args)
{
Security security = new Security()
{
Id = Guid.NewGuid(),
Denomination = 1,
Name = "A",
Quatation = "Z",
ReportPeriods = new List<ReportPeriod>()
};
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 10,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now,
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 5,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now,
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 5,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now.AddMonths(-1),
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
foreach (var groupedReportValues in security.ReportPeriods
.GroupBy(period => new { period.Start.Year, period.Start.Month }).Select(
groupedOnMonth => new
{
StartYear = groupedOnMonth.Key.Year,
StartMonth = groupedOnMonth.Key.Month,
AmountSum = groupedOnMonth.Sum(reportValue => reportValue.Amount)
}))
{
Console.WriteLine(groupedReportValues.StartYear);
Console.WriteLine(groupedReportValues.StartMonth);
Console.WriteLine(groupedReportValues.AmountSum);
Console.WriteLine();
}
Console.ReadLine();
}
}
}
名称空间解决方案
{
使用制度;
使用System.Collections.Generic;
使用System.Linq;
公共安全
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共字符串等式{get;set;}
//public SecurityType SecurityType{get;set;}
公共双面值{get;set;}
//public CurrencyType DemoniationType{get;set;}
公共虚拟ICollection ReportPeriods{get;set;}
}
公开课报告期
{
公共Guid Id{get;set;}
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
公共Guid SecurityId{get;set;}
公共Guid StockExchangeId{get;set;}
公共双倍金额{get;set;}
公共虚拟安全性{get;set;}
}
公共类实体
{
公共静态void Main(字符串[]args)
{
安全性=新安全性()
{
Id=Guid.NewGuid(),
面额=1,
Name=“A”,
Quatation=“Z”,
ReportPeriods=新列表()
};
security.ReportPeriods.Add(新的ReportPeriod()
{
金额=10,
安全=安全,
SecurityId=security.Id,
End=DateTime.Now.AddDays(1),
开始=日期时间。现在,
Id=Guid.NewGuid(),
StockExchangeId=Guid.NewGuid()
});
security.ReportPeriods.Add(新的ReportPeriod()
{
金额=5,
安全=安全,
SecurityId=security.Id,
End=DateTime.Now.AddDays(1),
开始=日期时间。现在,
Id=Guid.NewGuid(),
StockExchangeId=Guid.NewGuid()
});
security.ReportPeriods.Add(新的ReportPeriod()
{
金额=5,
安全=安全,
SecurityId=security.Id,
End=DateTime.Now.AddDays(1),
开始=DateTime.Now.AddMonths(-1),
Id=Guid.NewGuid(),
StockExchangeId=Guid.NewGuid()
});
foreach(var groupedReportValues,在security.ReportPeriods中
.GroupBy(period=>new{period.Start.Year,period.Start.Month})。选择(
groupedOnMonth=>new
{
StartYear=groupedOnMonth.Key.Year,
StartMonth=groupedOnMonth.Key.Month,
AmountSum=groupedOnMonth.Sum(reportValue=>reportValue.Amount)
}))
{
WriteLine(groupedReportValues.StartYear);
Console.WriteLine(groupedReportValues.StartMonth);
Console.WriteLine(groupedReportValues.AmountSum);
Console.WriteLine();
}
Console.ReadLine();
}
}
}
开始日期和结束日期属性是否分别表示月开始日期和月结束日期(如2018-01-01 00:00:00和2018-01-31 23:59:59)?@user1672994否,例如,它可以是2-3天的范围。不知何故,我需要为一月份的收藏做准备:**amount@Jorge开始和结束的范围可以跨越一个月?懒惰的(技术上不正确的)替代方法可以是按两个日期的平均值按月分组,如果两个日期当前只有几天,我假设我们需要基于StartDate的数据,并相应地添加了分组逻辑。
Security s = new Security();
DateTime nowDate = DateTime.Now;
s.ReportPeriods = new List<ReportPeriod>();
for(int i = 0; i <= 70; i = i + 5)
{
s.ReportPeriods.Add(new ReportPeriod(nowDate.AddDays(i), nowDate.AddDays( i + 3), 200 ));
}
Dictionary<DateTime, double> AmountGroupedByMonth = s.AmountGroupedByMonth;
namespace Solutions
{
using System;
using System.Collections.Generic;
using System.Linq;
public class Security
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Quatation { get; set; }
//public SecurityType SecurityType { get; set; }
public double Denomination { get; set; }
//public CurrencyType DemoniationType { get; set; }
public virtual ICollection<ReportPeriod> ReportPeriods { get; set; }
}
public class ReportPeriod
{
public Guid Id { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public Guid SecurityId { get; set; }
public Guid StockExchangeId { get; set; }
public double Amount { get; set; }
public virtual Security Security { get; set; }
}
public class Entities
{
public static void Main(string[] args)
{
Security security = new Security()
{
Id = Guid.NewGuid(),
Denomination = 1,
Name = "A",
Quatation = "Z",
ReportPeriods = new List<ReportPeriod>()
};
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 10,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now,
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 5,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now,
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 5,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now.AddMonths(-1),
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
foreach (var groupedReportValues in security.ReportPeriods
.GroupBy(period => new { period.Start.Year, period.Start.Month }).Select(
groupedOnMonth => new
{
StartYear = groupedOnMonth.Key.Year,
StartMonth = groupedOnMonth.Key.Month,
AmountSum = groupedOnMonth.Sum(reportValue => reportValue.Amount)
}))
{
Console.WriteLine(groupedReportValues.StartYear);
Console.WriteLine(groupedReportValues.StartMonth);
Console.WriteLine(groupedReportValues.AmountSum);
Console.WriteLine();
}
Console.ReadLine();
}
}
}