I have a view model with properties that represent years and months:
public IEnumerable<SelectListItem> Years
{
get
{
return new SelectList(
Enumerable.Range(1900, 112)
.OrderByDescending(year => year)
.Select(year => new SelectListItem
{
Value = year.ToString(CultureInfo.InvariantCulture),
Text = year.ToString(CultureInfo.InvariantCulture)
}
), "Value", "Text");
}
}
public IEnumerable<SelectListItem> Months
{
get
{
return new SelectList(
Enumerable.Range(1, 12)
.OrderByDescending(month => month)
.Select(month => new SelectListItem
{
Value = month.ToString(CultureInfo.InvariantCulture),
Text = month < 10 ? string.Format("0{0}", month) : month.ToString(CultureInfo.InvariantCulture)
}
), "Value", "Text");
}
}
Definitely I use copy & paste approach here) How can I refactor this code? Mabby somehow passing the numbers as parameters to some helper method?
Edits:
Besides, I have other SelectListItem with strings, so I decided to create new static class with static method to handle both cases: strings and numbers. Here is my code:
public static class SelectListHelper
{
public static IEnumerable<SelectListItem> GetSelectList(IEnumerable<string> list)
{
return new SelectList(
list.Select(i => new SelectListItem
{
Value = i,
Text = i
}
), "Value", "Text");
}
}
And the code from model:
private IEnumerable<string> _years = GetEnumerableRange(1900, 113);
private IEnumerable<string> GetEnumerableRange(int start, int count)
{
return Enumerable.Range(start, count)
.Reverse()
.Select(i => i.ToString(CultureInfo.InvariantCulture));
}
So, now I can do the following:
public IEnumerable<SelectListItem> Years
{
get { return SelectListHelper.GetSelectList(_years); }
}
public IEnumerable<SelectListItem> Colors
{
// _colors is of type List<string>
get { return SelectListHelper.GetSelectList(_colors); }
}
I decided to not give a f**k about {0:00} format)
.Reverse()
is simpler and more efficient. Also, do you really want to have the months backwards, or is that a copy & paste error? – svick Jan 23 at 19:29