將列舉型別(Enum)的Names及Values Zip起來
Enum 類別可以透過 GetNames 擷取常數名稱的陣列,可以透過 GetValues 擷取常數值的陣列。
然而,有時我們需要它的名稱及常數值在一起,組成如 ListItem ,所以可以用 Zip 把它們合起來,如下,
public enum ArrivalStatus { Late = -1, OnTime = 0, Early = 1 };
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Type arrivalStatusType = typeof(ArrivalStatus);
var arrivalStatusNames = Enum.GetNames(arrivalStatusType);
var arrivalStatusValues = Enum.GetValues(arrivalStatusType).Cast<int>();
var arrivalStatusItems = arrivalStatusNames.Zip(arrivalStatusValues,
(name, value) => new ListItem { Text = name, Value = value.ToString() }
);
DropDownList1.Items.AddRange(arrivalStatusItems.ToArray());
}
}
如果要讓對每個enum都可以用的話,就可以建立擴充方法哦! 如下,
public static class EnumHelper
{
public static IEnumerable<ListItem> GetItems(this Type enumType)
{
if (!enumType.IsEnum)
throw new Exception("必須是Enum!");
var enumNames = Enum.GetNames(enumType);
var enumValues = Enum.GetValues(enumType).Cast<int>();
var enumItems = enumNames.Zip(enumValues,
(name, value) => new ListItem { Text = name, Value = value.ToString() }
);
return enumItems;
}
}
原本的使用就只要Call它的GetItems擴充方法就可以了哦!
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Type arrivalStatusType = typeof(ArrivalStatus);
var arrivalStatusItems = arrivalStatusType.GetItems();
DropDownList1.Items.AddRange(arrivalStatusItems.ToArray());
}
}
參考資料
Enumerable.Zip<TFirst, TSecond, TResult> 方法
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^