咨询区

  • Peter Mortensen

如何使用 C# 迭代 enum ?

下面的代码会编译失败,错误信息: 'Suit' is a 'type' but is used like a 'variable'


public enum Suit
{Spades,Hearts,Clubs,Diamonds
}public void EnumerateAllSuitsDemoMethod()
{foreach (Suit suit in Suit){DoSomething(suit);}
}

回答区

  • Ian Boyd

可以这么实现。


foreach (Suit suit in (Suit[]) Enum.GetValues(typeof(Suit)))
{
}

注意:转成 Suit[] 不是必须的,但会有 0.5ns 的提速。


  • Jap

我给 enum 实现了一些便捷的扩展,我想应该有朋友用的上。


public static class EnumExtensions
{/// <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>/// <param name="value">The value.</param>/// <returns></returns>public static IEnumerable<T> GetAllItems<T>() where T : struct{foreach (object item in Enum.GetValues(typeof(T))){yield return (T)item;}}/// <summary>/// Gets all combined items from an enum value./// </summary>/// <typeparam name="T"></typeparam>/// <param name="value">The value.</param>/// <returns></returns>/// <example>/// Displays ValueA and ValueB./// <code>/// EnumExample dummy = EnumExample.Combi;/// foreach (var item in dummy.GetAllSelectedItems<EnumExample>())/// {///    Console.WriteLine(item);/// }/// </code>/// </example>public static IEnumerable<T> GetAllSelectedItems<T>(this Enum value){int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture);foreach (object item in Enum.GetValues(typeof(T))){int itemAsInt = Convert.ToInt32(item, CultureInfo.InvariantCulture);if (itemAsInt == (valueAsInt & itemAsInt)){yield return (T)item;}}}/// <summary>/// Determines whether the enum value contains a specific value./// </summary>/// <param name="value">The value.</param>/// <param name="request">The request.</param>/// <returns>///     <c>true</c> if value contains the specified value; otherwise, <c>false</c>./// </returns>/// <example>/// <code>/// EnumExample dummy = EnumExample.Combi;/// if (dummy.Contains<EnumExample>(EnumExample.ValueA))/// {///     Console.WriteLine("dummy contains EnumExample.ValueA");/// }/// </code>/// </example>public static bool Contains<T>(this Enum value, T request){int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture);int requestAsInt = Convert.ToInt32(request, CultureInfo.InvariantCulture);if (requestAsInt == (valueAsInt & requestAsInt)){return true;}return false;}
}

不过 enum 必须打上 FlagsAttribute 标记。


[Flags]
public enum EnumExample
{ValueA = 1,ValueB = 2,ValueC = 4,ValueD = 8,Combi = ValueA | ValueB
}

  • Mallox

Enum.GetValues 在 .NET Compact Framework 版本中是不支持的,需要用反射实现。


public static List<T> GetEnumValues<T>() where T : new() {T valueType = new T();return typeof(T).GetFields().Select(fieldInfo => (T)fieldInfo.GetValue(valueType)).Distinct().ToList();
}public static List<String> GetEnumNames<T>() {return typeof (T).GetFields().Select(info => info.Name).Distinct().ToList();
}

调用方式如下:


List<MyEnum> result = Utils.GetEnumValues<MyEnum>();

点评区

相信有很有朋友都遇到过迭代 enum 的需求,比如说将 enum 绑定到 下拉框 中,不过很遗憾的是,FCL 提供的 Enum 太弱了,不过在 .NET 5 中 Enum 得到了加强。

在 .NET5 中直接修改如下即可。

var suitsList = Enum.GetValues<Suits>();

原文链接:https://stackoverflow.com/questions/105372/how-to-enumerate-an-enum

NET问答: 如何迭代 Enum ?相关推荐

  1. 视频问答兴起,多跳问答热度衰退,92篇论文看智能问答的发展趋势

    星标/置顶小屋,带你解锁 最萌最前沿的NLP.搜索与推荐技术 文 | 舒意恒(南京大学硕士生,知识图谱方向) 编 |  北大小才女小轶 2019年的时候,舒意恒Y.Shu整理了一份<2019年, ...

  2. java总复习3-面向对象

    文章目录 一.继承 1.定义 2.格式 extends implements 3. super&this 4.构造器 5. 作用 6.特性 7.注意 二.重写与重载 1.重写(override ...

  3. 语言基础快速预览-Lua

    语言基础快速预览-Lua 数据类型 变量 循环 流程控制 函数 运算符 字符串 数组 迭代器 table Lua模块与包 Lua元表 协同程序 文件I/O 错误处理 面向对象 初阶话题 进阶话题 高阶 ...

  4. ACL 2020 | 多跳问答的基于对齐的无监督迭代解释检索方法

    ©PaperWeekly 原创 · 作者|舒意恒 学校|南京大学硕士生 研究方向|知识图谱 论文标题:Unsupervised Alignment-based Iterative Evidence R ...

  5. 【C语言】问答总结 | 神奇的迭代公式两种解法

    题目   有一个神奇的迭代公式:x​n+1 ​​​= x ​ n ​ + 2 ​​​ \sqrt{x_{​n​+2}​​​} x​n​+2​​​​ ​,无论 x 的初值(正数)选的多么大,若干次迭代之 ...

  6. 125个基本的C#面试问答(为了以后能玩unity,转了吧,亲)

    125个基本的C#面试问答 2014/08/03 | 分类: IT职场, 开发 | 2 条评论 | 标签: 面试 分享到:35 本文由 伯乐在线 - EluQ 翻译自 blogspot.jp.未经许可 ...

  7. 分层条件关系网络在视频问答VideoQA中的应用:CVPR2020论文解析

    分层条件关系网络在视频问答VideoQA中的应用:CVPR2020论文解析 Hierarchical Conditional Relation Networks for Video Question ...

  8. 服务器温度3d显示,智能问答助手、3D可视化展示,腾讯医典“黑科技”助力科普更有温度...

    创新科技与医学科普的融合,将带来什么样的变化? 5 月21- 23 日,腾讯全球数字生态大会在云南昆明举办.在智慧医疗专场,腾讯医典正式发布其在医学科普领域的两大前沿探索:智能问答助手,借助系统化医学 ...

  9. 阿里达摩院刷新纪录,开放域问答成绩比肩人类水平,超微软、Facebook

    出品 | AI科技大本营(ID:rgznai100) 近日,由阿里巴巴达摩院语言技术实验室研发的 Multi-Doc Enriched BERT 模型在微软的 MS MARCO 数 据评测任务,Pas ...

最新文章

  1. 【Android UI设计与开发】第12期:顶部标题栏(三)ActionBar实现层级导航的返回效果
  2. Java多线程的同步机制:synchronized
  3. LINUX下如何重启动网络服务
  4. ML.NET 推荐引擎中一类矩阵因子分解的缺陷
  5. 使用Storm进行可扩展的实时状态更新
  6. snapshot---caffemodel和solverstate
  7. 【Gym - 101608G】WiFi Password (区间或,线段树 或 按位处理+尺取 或 二分)
  8. ORACLE 等待事件
  9. 资源分享 | 知识蒸馏总结、应用与扩展(2015-2019)
  10. 基于SpringCloud的微服务架构演变史?
  11. php实现sql server数据导入到mysql数据库_SQL Server数据库导入MySQL数据库的体验_MySQL...
  12. MySQL中的联合索引
  13. 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
  14. Android widget开发有感
  15. 十一、网络编程。TCP\UDP\socket
  16. Android 各国语言包字符串缩写
  17. 通俗地讲一下庞加莱猜想是怎么回事(from 鼓浪)
  18. 一网打尽“小黄图”!手把手教你造一只AI鉴黄神器(内附代码及数据集)
  19. 中心极限定理和Berry-Esseen中心极限定理
  20. 图像处理方面的sci期刊_图像处理领域的SCI期刊.doc

热门文章

  1. php mysql insert 变量,php – 在blueimp / jquery-file-upload上添加更多自定义变量给mysql insert...
  2. python pack unpack_golang 仿python pack/unpack
  3. oo第三次博客-JML规格
  4. Feign从配置文件中读取url
  5. webpack之DefinePlugin使用
  6. Spark 性能调优-内存设置-GC设置
  7. WPF将数据库和GridView绑定并更改GridView模板
  8. C#编程中的66个好习惯,你有多少个?(转)
  9. 在Marketplace上销售应用【WP7学习札记之十八】
  10. GChemPaint-绘制化学分子布局