-1

我有一个视图模型,其属性代表年和月:

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

绝对我在这里使用复制和粘贴方法)我如何重构这段代码?Mabby 以某种方式将数字作为参数传递给某个辅助方法?

4

1 回答 1

1

只是大声思考,但这里的共同部分是“获取一系列值,对它们进行排序,并将每个值包装在一个包装器对象中,其文本值为(如何获取文本)”。也就是说,您可以执行以下操作:

private IEnumerable<SelectListItem> GetXXXX(
       int start, 
       int count, 
       Func<int,string> nameGetter)
{
    return Enumerable
        .Range(start, count)
        .OrderByDescending (i => i)
        .Select(i => 
            new SelectListItem() 
            { 
                Value = i.ToString(CultureInfo.InvariantCulture),
                Text = nameGetter(i)
            });
}

例如,您的“月份”将是:

public IEnumerable<SelectListItem> Months
{
    get 
    { 
        return GetXXXX(1, 12, m => 
              m < 10 
                ? string.Format("0{0}", m) 
                : m.ToString(CultureInfo.InvariantCulture));
    }
}
于 2013-01-23T17:56:17.193 回答