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

ここでは間違いなくコピーアンドペーストのアプローチを使用しています)このコードをリファクタリングするにはどうすればよいですか?マビーはどういうわけかいくつかのヘルパーメソッドにパラメータとして数値を渡しますか?

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 に答える