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.