Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何选择按月分组的行_C#_.net_Linq - Fatal编程技术网

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();
        }
    }
}