Как перечислить все названия месяцев, например, для комбо? - PullRequest
65 голосов
/ 24 ноября 2008

В данный момент я создаю DateTime для каждого месяца и форматирую его, чтобы включить только месяц.
Есть ли другой или лучший способ сделать это?

Ответы [ 14 ]

147 голосов
/ 24 ноября 2008

Вы можете использовать DateTimeFormatInfo, чтобы получить эту информацию:

// Will return January
string name = DateTimeFormatInfo.CurrentInfo.GetMonthName(1);

или получить все имена:

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;

Вы также можете создать новую DateTimeFormatInfo на основе CultureInfo с DateTimeFormatInfo.GetInstance или использовать свойство CultureInfo.DateTimeFormat текущей культуры.

var dateFormatInfo = CultureInfo.GetCultureInfo("en-GB").DateTimeFormat;

Имейте в виду, что календари в .Net поддерживают до 13 месяцев, поэтому в конце вы получите дополнительную пустую строку для календарей только с 12 месяцами (такими, как, например, в en-US или fr). 1021 *

28 голосов
/ 12 июня 2013

Этот метод позволит вам применить список пар ключ-значение месяцев к их внутренним аналогам. Мы генерируем его одной строкой, используя Enumerable Ranges и LINQ. Ура, LINQ code-golfing!

var months = Enumerable.Range(1, 12).Select(i => new { I = i, M = DateTimeFormatInfo.CurrentInfo.GetMonthName(i) });

Чтобы применить его к раскрывающемуся списку ASP:

// <asp:DropDownList runat="server" ID="ddlMonths" />
ddlMonths.DataSource = months;
ddlMonths.DataTextField = "M";
ddlMonths.DataValueField = "I";
ddlMonths.DataBind();
19 голосов
/ 24 ноября 2008

Вы можете использовать следующее для возврата массива строк, содержащих названия месяцев

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
12 голосов
/ 24 ноября 2008

Они определены как массив в пространствах имен Globalization.

using System.Globalization;

for (int i = 0; i < 12; i++) {
   Console.WriteLine(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]);
}
5 голосов
/ 24 ноября 2008

Попробуйте перечислить названия месяцев:

for( int i = 1; i <= 12; i++ ){
  combo.Items.Add(CultureInfo.CurrentCulture.DateTimeFormat.MonthNames[i]);
}

Он находится в пространстве имен System.Globalization.

Надеюсь, это поможет!

4 голосов
/ 24 ноября 2008

Вы можете получить список локализованных месяцев от Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames и инвариантных месяцев от DateTimeFormatInfo.InvariantInfo.MonthNames.

string[] localizedMonths = Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames;
string[] invariantMonths = DateTimeFormatInfo.InvariantInfo.MonthNames;

for( int month = 0; month < 12; month++ )
{
    ListItem monthListItem = new ListItem( localizedMonths[month], invariantMonths[month] );
    monthsDropDown.Items.Add( monthListItem );
}

Может быть некоторая проблема с количеством месяцев в году в зависимости от типа календаря, но я только что предположил 12 месяцев в этом примере.

3 голосов
/ 03 февраля 2015

Небольшое LINQ только потому, что оно красиво сжато:

var monthOptions = DateTimeFormatInfo.CurrentInfo.MonthNames
    .Where(p=>!string.IsNullOrEmpty(p))
    .Select((item, index) => new { Id = index + 1, Name = item });

Вам нужно предложение Where, поскольку календарь возвращает имя 13-го месяца (пусто на английском языке).

Индекс возвращает индекс в IEnumerable, поэтому вам нужно +1 для фактического индекса месяца.

3 голосов
/ 22 апреля 2014

Способ получения динамической культуры определенного списка названий месяцев в C # с помощью LINQ .

ComboBoxName.ItemsSource= 
System.Globalization.CultureInfo.
CurrentCulture.DateTimeFormat.MonthNames.
TakeWhile(m => m != String.Empty).ToList();

OR

В этом примере создается анонимный объект со свойством Month и MonthName

var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
 .TakeWhile(m => m != String.Empty)
 .Select((m,i) => new  
 {  
     Month = i+1,  
     MonthName = m
 }) 
 .ToList();

PS : Мы используем метод TakeWhile, потому что массив MonthNames содержит пустой 13-й месяц.

3 голосов
/ 07 августа 2013
public IEnumerable<SelectListItem> Months
{
  get
  {
    return Enumerable.Range(1, 12).Select(x => new SelectListItem
    {
      Value = x.ToString(),
      Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x)
    });
  }
}
1 голос
/ 13 февраля 2019

Конечно, я внесу свой вклад в вопрос 10+ лет.

В моем случае я создаю свойство, которое возвращает словарь (или аналогичный), сгенерированный с помощью следующего кода:

Dictionary<int, string> Months = Enumerable.Range(1, 12).Select(i => new KeyValuePair<int, string>(i, System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i))).ToDictionary(x => x.Key, x => x.Value);

Выход (из Linqpad):

Key Value
1   January
2   February
3   March
4   April
5   May
6   June
7   July
8   August
9   September
10  October
11  November
12  December

Надеюсь, кто-нибудь найдет это полезным!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...