[.NET]將列舉型別(Enum)的Names及Values Zip起來

將列舉型別(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());
	}
}

image

 

如果要讓對每個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());
	}
}

 

參考資料

Enum 類別

ASP.NET MVC 5 Fundamentals

Enumerable.Zip<TFirst, TSecond, TResult> 方法

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^