C# 可枚举。动态向后拉月的范围

C# 可枚举。动态向后拉月的范围,c#,model-view-controller,C#,Model View Controller,我正在编写一份MVC框架报告,我们试图将用户的数据限制为两年(从今天开始)。根据他们的要求,我们有一个月和年的下拉列表,用户只能看到两年的数据。因此,目前,如果他们选择2013年,他们只能看到11月和12月 填充了DDL的年份,现在我尝试根据所选年份填充月份列表 这几个月来让我兴奋不已的是: var months = Enumerable.Range(1, DateTime.Today.Month) .Select(x => new SelectListItem { Text =

我正在编写一份MVC框架报告,我们试图将用户的数据限制为两年(从今天开始)。根据他们的要求,我们有一个月和年的下拉列表,用户只能看到两年的数据。因此,目前,如果他们选择2013年,他们只能看到11月和12月

填充了DDL的年份,现在我尝试根据所选年份填充月份列表

这几个月来让我兴奋不已的是:

var months = Enumerable.Range(1, DateTime.Today.Month)
    .Select(x => new SelectListItem { Text = x.ToString(), Value = x.ToString() });

return new SelectList(months.ToList(), "Value", "Text");
对这些查询不熟悉,但感觉必须有一种方法在查询本身中实现这一点


提前谢谢

代码不是很紧凑,但可能会对您有所帮助

List<int> months = new List<int>();
int year = 2013; //selected year
var today = DateTime.Now;

if (year == today.Year)
    months = Enumerable.Range(1, today.Month).ToList();
else if (year == today.Year - 1)
    months = Enumerable.Range(1, 12).ToList();
else if (year == today.Year - 2)
    months = Enumerable.Range(today.Month, 12 - (today.Month - 1)).ToList();
列表月份=新列表();
国际年=2013年//选定年份
var today=DateTime.Now;
如果(年==今天.年)
月份=可枚举的.Range(1,今天.Month.ToList();
else if(年==今天。年-1)
月份=可枚举的.Range(1,12).ToList();
else if(年==今天。年-2)
月份=可枚举的.Range(今天.Month,12-(今天.Month-1)).ToList();
编辑

如果您需要月份名称列表

//using System.Globalization;
string[] monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames; //all month names
List<string> ddMonths = monthNames.Where((m, idx) => months.Contains(idx + 1)).ToList();
//使用系统全球化;
字符串[]monthNames=DateTimeFormatInfo.CurrentInfo.monthNames//所有月份名称
列出ddmonthnames.Where((m,idx)=>months.Contains(idx+1)).ToList();

使用Linq,您可以在一行代码中串联三个不同的月份列表:

1-本年剩余月份

2-明年全年

3-从下一年的月份到开始月份

试一试:

static void Main(string[] args)
    {
        var list =
            System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.Select(s => s + " " + DateTime.Today.Year)    // Get now through the end of the year
                    .Skip(DateTime.Today.Month - 1)
                    .Take(12 - (DateTime.Today.Month - 1))
                    .ToList()
                .Concat(System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.Select(s => s + " " + DateTime.Today.AddYears(1).Year).Take(12))  // Tack on next year
                .Concat(System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.Select(s => s + " " + DateTime.Today.AddYears(2).Year)    // Tack on the last months
                    .Take(DateTime.Today.Month - 1))
                    .ToList();

        foreach (var item in list)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
以下是控制台输出:

2015年11月

2015年12月

2016年1月

2016年2月

2016年3月

2016年4月

2016年5月

2016年6月

2016年7月

2016年8月

2016年9月

2016年10月

2016年11月

2016年12月

2017年1月

2017年2月

2017年3月

2017年4月

2017年5月

2017年6月

2017年7月

2017年8月

2017年9月


2017年10月

另一种方法是在查询中执行此操作:

Console.Write("Enter a year: ");
int year = int.Parse(Console.ReadLine());
int maxYearsBack = 2;

var months = Enumerable.Range(1, 12).Where(m =>
    (DateTime.Today.Year == year && m <= DateTime.Today.Month) || // This year
    (DateTime.Today.Year != year && (DateTime.Today.Year - year < maxYearsBack || m - DateTime.Today.Month >= 0)) // Middle and max years back
).Select(x => x.ToString());

Console.WriteLine("Months for year {0}: {1}", year, String.Join(", ", months));
如果您还需要姓名,只需将最后一个
选择更改为:

...).Select(x => new SelectListItem { Text = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x), Value = x.ToString() });

如果他们选择2015年,你会在月份下拉列表中显示什么?MYou需要在此处某处进行比较,以查看所选年份并相应填充月份。@Shyju,2015将显示当前月份的所有月份。2015年1月-11月-2014年12月-2013年12月-2个月如何保持这一简单并有一个下拉列表。每个选项都将显示年份和月份。“2015年11月”、“2015年10月”等。如果用户已经选择了Jan,但选择了2013年,则您的工作量会减少,用户也会更轻松,对月份下拉列表的困惑也会减少。也很容易实现:对于从datetime现在减去i个月(其中i为0,当i大于23时结束)的循环。哇,这正是我想要的。非常感谢你!
...).Select(x => new SelectListItem { Text = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x), Value = x.ToString() });