NET问答: 如何迭代 Enum ?
咨询区
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 ?相关推荐
- 视频问答兴起,多跳问答热度衰退,92篇论文看智能问答的发展趋势
星标/置顶小屋,带你解锁 最萌最前沿的NLP.搜索与推荐技术 文 | 舒意恒(南京大学硕士生,知识图谱方向) 编 | 北大小才女小轶 2019年的时候,舒意恒Y.Shu整理了一份<2019年, ...
- java总复习3-面向对象
文章目录 一.继承 1.定义 2.格式 extends implements 3. super&this 4.构造器 5. 作用 6.特性 7.注意 二.重写与重载 1.重写(override ...
- 语言基础快速预览-Lua
语言基础快速预览-Lua 数据类型 变量 循环 流程控制 函数 运算符 字符串 数组 迭代器 table Lua模块与包 Lua元表 协同程序 文件I/O 错误处理 面向对象 初阶话题 进阶话题 高阶 ...
- ACL 2020 | 多跳问答的基于对齐的无监督迭代解释检索方法
©PaperWeekly 原创 · 作者|舒意恒 学校|南京大学硕士生 研究方向|知识图谱 论文标题:Unsupervised Alignment-based Iterative Evidence R ...
- 【C语言】问答总结 | 神奇的迭代公式两种解法
题目 有一个神奇的迭代公式:xn+1 = x n + 2 \sqrt{x_{n+2}} xn+2 ,无论 x 的初值(正数)选的多么大,若干次迭代之 ...
- 125个基本的C#面试问答(为了以后能玩unity,转了吧,亲)
125个基本的C#面试问答 2014/08/03 | 分类: IT职场, 开发 | 2 条评论 | 标签: 面试 分享到:35 本文由 伯乐在线 - EluQ 翻译自 blogspot.jp.未经许可 ...
- 分层条件关系网络在视频问答VideoQA中的应用:CVPR2020论文解析
分层条件关系网络在视频问答VideoQA中的应用:CVPR2020论文解析 Hierarchical Conditional Relation Networks for Video Question ...
- 服务器温度3d显示,智能问答助手、3D可视化展示,腾讯医典“黑科技”助力科普更有温度...
创新科技与医学科普的融合,将带来什么样的变化? 5 月21- 23 日,腾讯全球数字生态大会在云南昆明举办.在智慧医疗专场,腾讯医典正式发布其在医学科普领域的两大前沿探索:智能问答助手,借助系统化医学 ...
- 阿里达摩院刷新纪录,开放域问答成绩比肩人类水平,超微软、Facebook
出品 | AI科技大本营(ID:rgznai100) 近日,由阿里巴巴达摩院语言技术实验室研发的 Multi-Doc Enriched BERT 模型在微软的 MS MARCO 数 据评测任务,Pas ...
最新文章
- 【Android UI设计与开发】第12期:顶部标题栏(三)ActionBar实现层级导航的返回效果
- Java多线程的同步机制:synchronized
- LINUX下如何重启动网络服务
- ML.NET 推荐引擎中一类矩阵因子分解的缺陷
- 使用Storm进行可扩展的实时状态更新
- snapshot---caffemodel和solverstate
- 【Gym - 101608G】WiFi Password (区间或,线段树 或 按位处理+尺取 或 二分)
- ORACLE 等待事件
- 资源分享 | 知识蒸馏总结、应用与扩展(2015-2019)
- 基于SpringCloud的微服务架构演变史?
- php实现sql server数据导入到mysql数据库_SQL Server数据库导入MySQL数据库的体验_MySQL...
- MySQL中的联合索引
- 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
- Android widget开发有感
- 十一、网络编程。TCP\UDP\socket
- Android 各国语言包字符串缩写
- 通俗地讲一下庞加莱猜想是怎么回事(from 鼓浪)
- 一网打尽“小黄图”!手把手教你造一只AI鉴黄神器(内附代码及数据集)
- 中心极限定理和Berry-Esseen中心极限定理
- 图像处理方面的sci期刊_图像处理领域的SCI期刊.doc
热门文章
- php mysql insert 变量,php – 在blueimp / jquery-file-upload上添加更多自定义变量给mysql insert...
- python pack unpack_golang 仿python pack/unpack
- oo第三次博客-JML规格
- Feign从配置文件中读取url
- webpack之DefinePlugin使用
- Spark 性能调优-内存设置-GC设置
- WPF将数据库和GridView绑定并更改GridView模板
- C#编程中的66个好习惯,你有多少个?(转)
- 在Marketplace上销售应用【WP7学习札记之十八】
- GChemPaint-绘制化学分子布局