2

可能重复:
Linq orderby,从特定数字开始,然后返回最低

我需要创建一个列出一年中月份的组合框,但需要它从当前月份开始,然后按月份顺序排列,例如:

10
月 11 月
12
月 1 月
2
月 3 月
等等......

数据源是数据库中的月份列表,根据月份编号(即一月 = 1 等)进行编号,然后对其进行操作以给出日期时间

如何在 C# 中对这个列表进行排序,以便得到我想要的顺序?

TIA。

4

4 回答 4

6
string[] months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;
var ordered = months.Skip(DateTime.Today.Month - 1)
                    .Concat(months.Take(DateTime.Today.Month - 1))
                    .Where(s=>!String.IsNullOrEmpty(s))
                    .ToList();
于 2012-10-18T10:41:53.633 回答
3

使用DateTimeFormatInfo.GetMonthName 方法

List<string> list = new List<string>();
DateTimeFormatInfo dtFI = new DateTimeFormatInfo();
DateTime currentDate = DateTime.Now;
DateTime nextyearDate = currentDate.AddYears(1).AddDays(-1);
while (currentDate < nextyearDate)
{
    list.Add(dtFI.GetMonthName(currentDate.Month));
    currentDate = currentDate.AddMonths(1);
}

这将创建一个新的月份列表,从当前月份开始。

于 2012-10-18T10:44:24.543 回答
2

LINQ 对此的另一种看法:

// month name source, use what you prefer
var monthNames = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;
var sorted = Enumerable.Range(1, 12).Zip(monthNames, Tuple.Create)
            .OrderBy(t => (t.Item1 - DateTime.Today.Month + 12) % 12)
            .Select(t => t.Item2)
            .ToArray();
于 2012-10-18T10:47:30.223 回答
0

您可以在 C# 中使用List<DateTime> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.ToList();. 它List<DateTime>包含 13 个元素(末尾为空月份名称,但您始终可以删除最后一个元素monthNames.RemoveAt(monthNames.Count - 1); http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.monthnames.aspx

要重新排序此列表,您可以使用 获取当前月份编号索引DateTime.Now.Month.ToString("00");,然后重新构建列表newMonthNames = monthNames.GetRange(index, 12 - index).AddRange(monthNames.GetRange(0, index);

有很多方法可以做到这一点,就像其他人所展示的那样。

于 2012-10-18T10:50:45.277 回答