C# 实现枚举转列表

 更新时间:2020年12月28日 09:18:50   作者:独立观察员•博客  
这篇文章主要介绍了C# 如何实现枚举转列表,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

今天有朋友问我,ComboBox 怎么绑定一个 Enum,其实他的意思是枚举如何转换为列表。想想这确实是一个挺正常的需求,但我一时也只想到遍历,他觉得麻烦,于是我在网上帮忙查了一下,提取了三个方法,后来在常用代码工具库也看到一个方法,所以总共四个方法,分为两组,功能可以说都是一样的,就是形式不同,现在分享给大家。

#region 获取枚举列表

/// <summary>
/// 通过枚举对象获取枚举列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static List<T> GetEnumList<T>(this T value)
{
 var list = new List<T>();
 if (value is Enum)
 {
 var valData =Convert.ToInt32((T)Enum.Parse(typeof(T), value.ToString())) ;
 var tps =Enum.GetValues(typeof (T));

 list.AddRange(from object tp in tps where ((int)Convert.ToInt32((T)Enum.Parse(typeof(T), tp.ToString())) & valData) == valData select (T) tp);
 }

 return list;
}

/* 以下 参考:https://www.codenong.com/17123548/ */

/// <summary>
/// 通过枚举类型获取枚举列表;
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static List<T> GetEnumList<T>() where T : Enum
{
 List<T> list = Enum.GetValues(typeof(T)).OfType<T>().ToList();
 return list;
}

/* 以下 参考:https://www.codenong.com/105372/ */

/// <summary>
/// Gets all items for an enum value.(通过枚举对象获取所有枚举)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value.</param>
/// <returns></returns>
public static IEnumerable<T> GetAllItems<T>(this Enum value)
{
 foreach (object item in Enum.GetValues(typeof(T)))
 {
 yield return (T)item;
 }
}

/// <summary>
/// Gets all items for an enum type.(通过枚举类型获取所有枚举)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static IEnumerable<T> GetAllItems<T>() where T : struct
{
 foreach (object item in Enum.GetValues(typeof(T)))
 {
 yield return (T)item;
 }
}

#endregion

按返回值类型,可以是 1 和 2 为一组,3 和 4 为一组;按方法性质,也可以将 1 和 3 为一组,2 和 4 为一组。

1 和 2 都是返回 List ,3 和 4 都是返回可枚举集合 IEnumerable,这个也很方便进行遍历或者转为 List 。

1 和 3 都是扩展方法,可以方便地通过枚举对象来获取相应的枚举类型的所有枚举,只不过从业务上看,这样调用的意图不够明确;而 2 和 4 则都是普通静态方法,通过静态类调用,也是比较简洁,且意图明确。

下面,我们分别在每个方法体内右键 -- 创建单元测试:

最终单元测试代码如下:

[TestClass()]
public class EnumExtensionTests
{
 /// <summary>
 /// 枚举类型
 /// </summary>
 enum ELanguage
 {
 CSharp = 0,
 Java = 1,
 VB = 2
 }

 /// <summary>
 /// 枚举对象
 /// </summary>
 private ELanguage _eLanguage = ELanguage.CSharp;

 [TestMethod()]
 public void GetEnumListTest1()
 {
 List<ELanguage> list = _eLanguage.GetEnumList(); //通过枚举对象获取枚举列表;
 Assert.IsTrue(list.Count > 0);
 }

 [TestMethod()]
 public void GetEnumListTest()
 {
 List<ELanguage> list = EnumExtension.GetEnumList<ELanguage>(); //通过枚举类型获取枚举列表;
 Assert.IsTrue(list.Count > 0);
 }

 [TestMethod()]
 public void GetAllItemsTest()
 {
 var allItems = _eLanguage.GetAllItems<ELanguage>(); //通过枚举对象获取所有枚举;
 List<ELanguage> list = allItems.ToList();
 Assert.IsTrue(list.Count > 0);
 }

 [TestMethod()]
 public void GetAllItemsTest1()
 {
 var allItems = EnumExtension.GetAllItems<ELanguage>(); //通过枚举类型获取所有枚举;
 List <ELanguage> list = allItems.ToList();
 Assert.IsTrue(list.Count > 0);
 }
}

测试结果都是通过的:

最后给出代码地址:https://gitee.com/dlgcy/dotnetcodes/tree/dlgcy/DotNet.Utilities/ 枚举 

转载自 独立观察员•博客

以上就是C# 实现枚举转列表的详细内容,更多关于c# 枚举转列表的资料请关注脚本之家其它相关文章!

相关文章

  • C# GUID ToString的使用总结

    C# GUID ToString的使用总结

    这篇文章主要介绍了C# GUID ToString的使用总结,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C#中DataTable排序、检索、合并等操作实例

    C#中DataTable排序、检索、合并等操作实例

    这篇文章主要介绍了C#中DataTable排序、检索、合并等操作实例,其中详细介绍了DataTable.Select的一些注意问题和使用技巧等,需要的朋友可以参考下
    2014-04-04
  • C#判断一个类是否实现了某个接口3种实现方法

    C#判断一个类是否实现了某个接口3种实现方法

    这篇文章主要介绍了C#判断一个类是否实现了某个接口3种实现方法,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06
  • C# 排序算法之堆排序

    C# 排序算法之堆排序

    这里是指一种数据结构,而不是我们在C#中提到的用于存储引用类型对象的地方。它可以被当成一棵完全二叉树。
    2010-09-09
  • 对C#中public、private、protect的区别说明

    对C#中public、private、protect的区别说明

    这篇文章主要介绍了对C#中public、private、protect的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C# DataTable中Compute方法用法集锦(数值/字符串/运算符/表等操作)

    C# DataTable中Compute方法用法集锦(数值/字符串/运算符/表等操作)

    这篇文章主要介绍了C# DataTable中Compute方法用法,总结分析了DataTable中Compute方法常见的数值运算操作、字符串操作、运算符操作、表运算等相关技巧,需要的朋友可以参考下
    2016-06-06
  • C#实现Dictionary字典赋值的方法

    C#实现Dictionary字典赋值的方法

    本文主要介绍了C#实现Dictionary字典赋值的方法,如同java中的Hasttable,C#里面有Dictionary,可以实现很高效的键值对操作。感兴趣的可以了解一下
    2021-05-05
  • LINQ基础之Join和UNION子句

    LINQ基础之Join和UNION子句

    这篇文章介绍了LINQ使用Join和UNION子句的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Unity AssetBundle打包工具示例详解

    Unity AssetBundle打包工具示例详解

    这篇文章主要介绍了Unity AssetBundle打包工具,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • WPF实现可视化扫码器的示例代码

    WPF实现可视化扫码器的示例代码

    AForge.NET 是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,模糊系统,机器人控制等领域。本文就将用它编写一个可视化扫码器,感兴趣的可以了解一下
    2022-11-11

最新评论