1

我是 ASP.NET MVC 3 的新手,来自 RoR,所以我对 MVC 设计模式有些熟悉。

我创建了一个方法来生成要在 dropdownfor() 中使用的选择列表。

我在下面的工作,但我想知道我是否可以提高效率,或者至少用更少的代码做同样的事情?

谢谢

public static IEnumerable<SelectListItem> GetDistanceUnits(string distanceUnit)
    {
        DistanceUnit MilesUnit = new DistanceUnit();
        MilesUnit.OptionValue = "mi";
        MilesUnit.OptionName = "Miles";
        MilesUnit.OptionSelected = "";

        DistanceUnit KilometersUnit = new DistanceUnit();
        KilometersUnit.OptionValue = "km";
        KilometersUnit.OptionName = "Kilometers";
        KilometersUnit.OptionSelected = "";

        var distanceUnitList = new List<SelectListItem>();

        distanceUnitList.Add(new SelectListItem
        {
            Value = MilesUnit.OptionValue,
            Text = MilesUnit.OptionName,
            Selected = MilesUnit.OptionSelected == distanceUnit
        });

        distanceUnitList.Add(new SelectListItem
        {
            Value = KilometersUnit.OptionValue,
            Text = KilometersUnit.OptionName,
            Selected = KilometersUnit.OptionSelected == distanceUnit
        });

        return distanceUnitList.OrderByAscending(c => c.Text);
    }
4

4 回答 4

4

您可以使用这样的列表初始化程序进一步压缩代码:

var distanceUnitList = new List<SelectListItem> {
    new SelectListItem {
        Value = MilesUnit.OptionValue,
        Text = MilesUnit.OptionName,
        Selected = MilesUnit.OptionSelected == distanceUnit
    },
    new SelectListItem {
        Value = KilometersUnit.OptionValue,
        Text = KilometersUnit.OptionName,
        Selected = KilometersUnit.OptionSelected == distanceUnit
    }
};

否则,我会说这是一个非常紧凑的方法,组织得很好,并且可以在 MVC 应用程序的其他区域中非常可重用。

于 2013-06-25T17:55:48.047 回答
4

您可以使用生成器来创建列表,并使用一点点Linq来投影列表。

public static IEnumerable<SelectListItem> GetDistanceUnits(string distanceUnit)
{
    var distanceUnitList = GetUnits()
                                .Select(u =>
                                    new SelectListItem
                                        {
                                            Value = u.OptionValue,
                                            Text = u.OptionName,
                                            Selected = u.OptionSelected == distanceUnit
                                        })
                                .OrderByAscending(c => c.Text)
                                .ToList();

    return distanceUnitList;
}

private static IEnumerable<DistanceUnit> GetUnits()
{
    yield return new DistanceUnit
                    {
                        OptionValue = "mi";
                        OptionName = "Miles";
                        OptionSelected = "";
                    };

    yield return new DistanceUnit
                    {
                        OptionValue = "km";
                        OptionName = "Kilometers";
                        OptionSelected = "";
                    };
}
于 2013-06-25T17:57:43.437 回答
0

你可以用更少的代码来实现它,但我不确定它会提高多少效率:

var distanceUnitList = new List<SelectListItem>
                                               {
                                                   new SelectListItem{...},
                                                   new SelectListItem{...},
                                               };
于 2013-06-25T17:57:08.920 回答
0

如果您打算只使用这些局部变量一次(向 SelectListItem 提供数据),则不需要它们。您可以执行以下操作:

var distanceUnitList = new List<SelectListItem>() {
    new SelectListItem
    {
        Value = "mi",
        Text = "Miles",
        Selected = ("" == distanceUnit) // odd code...
    }, 
    new SelectListItem
    {
        Value = "km",
        Text = "Kilometers",
        Selected = ("" == distanceUnit)
    }
};
于 2013-06-25T18:00:19.413 回答