简体   繁体   中英

Efficient Way to Populate a List - ASP.NET MVC3

I am new to ASP.NET MVC 3, coming from RoR so I am somewhat familiar with the MVC design pattern.

I created a method that generates a select list to be used in a dropdownfor().

What I have below works but I was wondering if I can make it more efficient or at least do the same thing with less code?

Thanks

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

You can condense the code a little bit more by using a list initializer like this:

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

Otherwise I'd say that's a pretty compact method, nicely organized, and will be very reusable in other areas of your MVC application.

You can use a generator to create your list and a little Linq to project the list.

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

You could make it with a little less code, but I am not sure how much more efficient it would be:

var distanceUnitList = new List<SelectListItem>
                                               {
                                                   new SelectListItem{...},
                                                   new SelectListItem{...},
                                               };

If you are going to use those local variables only once (to supply data to the SelectListItem), you don't need them. You can do the following:

var distanceUnitList = new List<SelectListItem>() {
    new SelectListItem
    {
        Value = "mi",
        Text = "Miles",
        Selected = ("" == distanceUnit) // odd code...
    }, 
    new SelectListItem
    {
        Value = "km",
        Text = "Kilometers",
        Selected = ("" == distanceUnit)
    }
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM