从 C# 中的枚举中获取 int 值

这篇具有很好参考价值的文章主要介绍了从 C# 中的枚举中获取 int 值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问:

我有一个名为 Questions (复数)的课程。在这个类中有一个名为 Question(单数)的枚举,看起来像这样。

public enum Question
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

在 Questions 类中,我有一个 get(int foo) 函数,它为该 foo 返回一个 Questions 对象。有没有一种简单的方法可以从枚举中获取整数值,以便我可以执行类似 Questions.Get(Question.Role) 的操作?

答1:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

只需投射枚举,例如

int something = (int) Question.Role;

以上将适用于您在野外看到的绝大多数枚举,因为枚举的默认基础类型是 int。

然而,正如 cecilphillip 所指出的,枚举可以有不同的基础类型。如果枚举被声明为 uint、long 或 ulong,则应将其强制转换为枚举的类型;例如对于

enum StarsInMilkyWay:long {Sun = 1, V645Centauri = 2 .. Wolf424B = 2147483649};

你应该使用

long something = (long)StarsInMilkyWay.Wolf424B;

@Harry 这不是真的。您可以在不强制转换的情况下创建枚举,这不是必需的。而且我只在特殊情况下分配数字,大多数时候,我将其保留为默认值。但您可以执行 enum Test { Item = 1 } 并看到 1 == (int)Test.Item 是相等的。

@Jaider (int)Test.Item 那是演员表! () 是显式转换运算符。

@Sinthia V 他说您可以在不强制转换的情况下创建它,这是正确的

如果 enum Question 的基础类型不是 int 而是 long,则此转换将截断 Role 的整数值!

`当您接受 Enum 作为参数时,您知道只能获得固定数量的可能整数值。另一方面,如果您只采用 int,那么您必须验证该 int 是否在可接受的值范围内,从而使代码复杂化。你总是可以覆盖你的签名,比如 ```public void MyMethod(int x) { // do something with x } public void MyMethod(Enum x) { this.MyMethod((int) x); }`````

答2:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

由于枚举可以是任何整数类型(byte、int、short 等),因此获得枚举的基础整数值的更可靠的方法是结合使用 GetTypeCode 方法Convert 类:

enum Sides {
    Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;

object val = Convert.ChangeType(side, side.GetTypeCode());
Console.WriteLine(val);

无论底层的整数类型如何,这都应该有效。

在处理 T:enum (实际上是 T:struct, IConvertible 但这是另一回事)的泛型类型时,这种技术证明了它的价值。

你将如何修改它以打印出 side 的十六进制值?此示例显示十进制值。问题是 var 属于 object 类型,因此您需要将其拆箱,它变得比我想要的更混乱。

如果您想转换为 int 尝试(如果是枚举 Sides : int)[...] object val = Convert.ChangeType(side, typeof(int)); [...]

@TimAbell我真正能说的是,我们发现动态编译的aspx页面(您必须将.cs文件部署到实时服务器)正在为每个值分配不同的整数。这意味着在一台机器上序列化的对象,在不同的机器上用不同的值反序列化并有效地被破坏(导致数小时的混乱)。我们用 MS 提出了它,我似乎记得他们说过,当跨不同的框架版本构建时,不能保证自动生成的整数是相同的。

@TimAbell 在另一个场合,开发人员删除了一个过时/未使用的 Enum 值,导致序列中的所有其他值都减一。因此,我们的编码标准现在要求始终明确指定 ID,否则添加/删除甚至自动格式化代码(例如按字母顺序排序)将更改所有导致数据损坏的值。我强烈建议任何人明确指定所有 Enum 整数。如果它们与外部(数据库)存储的值相关,这一点非常重要。

答3:

huntsbot.com – 高效赚钱,自由工作

将其声明为具有公共常量的静态类:

public static class Question
{
    public const int Role = 2;
    public const int ProjectFunding = 3;
    public const int TotalEmployee = 4;
    public const int NumberOfServers = 5;
    public const int TopBusinessConcern = 6;
}

然后您可以将其引用为 Question.Role,它的计算结果始终为 int 或您定义的任何内容。

我会使用 static readonly int 因为常量被编译成它们的硬值。请参阅stackoverflow.com/a/755693/492

这个解决方案实际上并没有提供强类型枚举的真正好处。例如,如果我只想将 GameState-enum-parameter 传递给特定方法,编译器不应允许我将任何 int 变量作为参数传递。

@CADBloke 这正是您使用 const 而不是 static readonly 的原因,因为每次比较 static readonly 时,您都在进行方法调用以获取变量的值,而使用 const 您正在比较两个值类型直接。

@brettof86 是的, const 会更快,如果编译限制永远不会成为问题,那么一切都很好。

@Zack 我没有很好地解释这一点,compilation limitation 我的意思是该值在编译时是硬编码的,因此对该值的任何更改都需要 all 使用它的程序集被重新编译。我倾向于同意你的用法,因为改变价值观会产生深远的影响。

答4:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

在相关说明中,如果您想从 System.Enum 获取 int 值,则在此处给出 e:

Enum e = Question.Role;

您可以使用:

int i = Convert.ToInt32(e);
int i = (int)(object)e;
int i = (int)Enum.Parse(e.GetType(), e.ToString());
int i = (int)Enum.ToObject(e.GetType(), e);

最后两个简直丑陋。我更喜欢第一个。

第二个是最快的。

作为习惯在 Minecraft 改装中使用 Mixins 的人,第二个似乎是明显的赢家。

第 5 个选项(正如大多数答案所说)是: int i = (int)e; (不先转换为对象)

@andreyk2Hohlov Cannot convert type 'System.Enum' to 'int'

答5:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

Question question = Question.Role;
int value = (int) question;

将导致 value == 2。

所以像这样 Questions.Get(Convert.ToInt16(Question.Applications))

您可以简单地向任一方向投射;唯一需要注意的是枚举不强制执行任何操作(枚举值可能是 288,即使该数字不存在任何问题)

@jim:不,只需转换值: Questions.Get((int)Question.Applications);

答6:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

例子:

public enum EmpNo
{
    Raj = 1,
    Rahul,
    Priyanka
}

并在后面的代码中获取枚举值:

int setempNo = (int)EmpNo.Raj; // This will give setempNo = 1

或者

int setempNo = (int)EmpNo.Rahul; // This will give setempNo = 2

枚举将递增 1,您可以设置起始值。如果您不设置起始值,它将最初分配为 0。

属于 Raj 的东西也可以是 Rahul 或 Priyanka 吗?你的价值观冲突,应该加倍是唯一的,例如 0、1、2、4、8 等。这是我对枚举的核心关注。

@TimothyGonzalez 实际上,如果您没有明确指定它们的值,则枚举只是计数 1 ;)

@derHugo,这取决于您假设数值是以 10 为底还是以 2 为底。

@TimothyGonzalez 没什么好假设的......我只是指出,默认情况下,他们只会在 int 中计算 1,除非你明确定义

答7:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

它比您想象的要容易 - 枚举已经是 int。只是需要提醒一下:

int y = (int)Question.Role;
Console.WriteLine(y); // Prints 2

Nitpick:这个枚举已经是一个 int。其他枚举可能是不同的类型——试试“enum SmallEnum : byte { A, B, C }”

千真万确。 C# 参考:“每个枚举类型都有一个基础类型,它可以是除 char 之外的任何整数类型。”

答8:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

我最近在我的代码中不再使用枚举,而是使用具有受保护构造函数和预定义静态实例的类(感谢 Roelof - C# Ensure Valid Enum Values - Futureproof Method)。

鉴于此,以下是我现在处理此问题的方法(包括与 int 的隐式转换)。

public class Question
{
    // Attributes
    protected int index;
    protected string name;
    // Go with a dictionary to enforce unique index
    //protected static readonly ICollection values = new Collection();
    protected static readonly IDictionary values = new Dictionary();

    // Define the "enum" values
    public static readonly Question Role = new Question(2,"Role");
    public static readonly Question ProjectFunding = new Question(3, "Project Funding");
    public static readonly Question TotalEmployee = new Question(4, "Total Employee");
    public static readonly Question NumberOfServers = new Question(5, "Number of Servers");
    public static readonly Question TopBusinessConcern = new Question(6, "Top Business Concern");

    // Constructors
    protected Question(int index, string name)
    {
        this.index = index;
        this.name = name;
        values.Add(index, this);
    }

    // Easy int conversion
    public static implicit operator int(Question question) =>
        question.index; //nb: if question is null this will return a null pointer exception

    public static implicit operator Question(int index) =>        
        values.TryGetValue(index, out var question) ? question : null;

    // Easy string conversion (also update ToString for the same effect)
    public override string ToString() =>
        this.name;

    public static implicit operator string(Question question) =>
        question?.ToString();

    public static implicit operator Question(string name) =>
        name == null ? null : values.Values.FirstOrDefault(item => name.Equals(item.name, StringComparison.CurrentCultureIgnoreCase));


    // If you specifically want a Get(int x) function (though not required given the implicit converstion)
    public Question Get(int foo) =>
        foo; //(implicit conversion will take care of the conversion for you)
}

这种方法的优点是您可以从枚举中获得所有内容,但您的代码现在更加灵活,因此如果您需要根据 Question 的值执行不同的操作,您可以将逻辑放入 Question 本身(即以首选的 OO 方式),而不是在整个代码中放置大量案例语句来处理每种情况。

注意:答案于 2018-04-27 更新以利用 C# 6 功能;即声明表达式和 lambda 表达式主体定义。有关原始代码,请参见 revision history。这样做的好处是使定义不那么冗长;这是对此答案方法的主要抱怨之一。

我想这是显式转换和您必须编写的代码之间的权衡。仍然喜欢实施只是希望它不是那么长。 +1

我使用了几种不同类型的类,其结构与此类似。我发现他们在尝试遵循“以后不要让我成为白痴”的方法时会产生奇迹。

附言。喜欢这种方法的人可能对github.com/ardalis/SmartEnum感兴趣;一个泛型类,旨在为以上述方式定义的类提供类似枚举的功能。

答9:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

如果您想获取存储在变量中的枚举值的整数,其类型为 Question,例如在方法中使用,您可以简单地执行我在此示例中编写的操作:

enum Talen
{
    Engels = 1, Italiaans = 2, Portugees = 3, Nederlands = 4, Duits = 5, Dens = 6
}

Talen Geselecteerd;    

public void Form1()
{
    InitializeComponent()
    Geselecteerd = Talen.Nederlands;
}

// You can use the Enum type as a parameter, so any enumeration from any enumerator can be used as parameter
void VeranderenTitel(Enum e)
{
    this.Text = Convert.ToInt32(e).ToString();
}

这会将窗口标题更改为 4,因为变量 Geselecteerd 是 Talen.Nederlands。如果我将其更改为 Talen.Portugees 并再次调用该方法,则文本将更改为 3。

不幸的是,这种方法使用得越多,性能就越差。我在我的一些代码中尝试过,随着时间的推移,我的应用程序变得越来越慢,CPU 使用率越来越低。这意味着线程正在等待某些东西 - 我假设某种垃圾收集,可能是由于将枚举参数装箱到 ToInt32()。通过切换到一个简单的 int.Parse(),我能够完全消除这种糟糕的性能,并且无论代码运行多长时间,性能都保持不变。

答10:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

另一种方法:

Console.WriteLine("Name: {0}, Value: {0:D}", Question.Role);

这将导致:

Name: Role, Value: 2

这是我用例的最佳解决方案,因为我的枚举是 int 和 long 值的混合

答11:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

要确保枚举值存在然后解析它,您还可以执行以下操作。

// Fake Day of Week
string strDOWFake = "SuperDay";

// Real Day of Week
string strDOWReal = "Friday";

// Will hold which ever is the real DOW.
DayOfWeek enmDOW;

// See if fake DOW is defined in the DayOfWeek enumeration.
if (Enum.IsDefined(typeof(DayOfWeek), strDOWFake))
{
    // This will never be reached since "SuperDay"
    // doesn't exist in the DayOfWeek enumeration.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWFake);
}
// See if real DOW is defined in the DayOfWeek enumeration.
else if (Enum.IsDefined(typeof(DayOfWeek), strDOWReal))
{
    // This will parse the string into it's corresponding DOW enum object.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWReal);
}

// Can now use the DOW enum object.
Console.Write("Today is " + enmDOW.ToString() + ".");

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

原文链接:https://www.huntsbot.com/qa/MQVa/get-int-value-from-enum-in-c-sharp?lang=zh_CN&from=csdn

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求文章来源地址https://www.toymoban.com/news/detail-502906.html

到了这里,关于从 C# 中的枚举中获取 int 值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#之枚举中的按位与(&)按位或(|)。

    一些基础定义: 先看代码: 这是一个表示季节的枚举,主要看最后一个ALL 他表示上面所有季节的枚举。 很多人有时候会不知所以然。 今天详细解释下: 为什么ALL包含上面所有的季节选项,我们通过二进制计算下。 计算的结果为 ALL 为 15 对应的二进制为: 1111 又因为 HasF

    2024年02月12日
    浏览(28)
  • MySQL如何从日期时间值中获取年、月、日等部分日期或时间值?底层原理是什么?

    在MySQL中,可以使用一系列内置函数来从日期时间值中获取年、月、日等部分日期或时间值。以下是一些常用的函数: YEAR() :用于从日期时间值中提取年份。例如, SELECT YEAR(\\\'2023-06-12\\\') 将返回2023。 MONTH() :用于从日期时间值中提取月份。例如, SELECT MONTH(\\\'2023-06-12\\\') 将返回

    2024年02月07日
    浏览(37)
  • C# 获取鼠标在屏幕中的位置(获取鼠标坐标)

    近段时间需要一个鼠标点击器,目前能找到的都不太符合使用要求,所以就准备自己写一个 如果需要显示文本就把int转换成string. 如果需要显示到窗体上可以把int转换成string 如果需要实时获取位置信息可以把GetMousePose()方法放到Timer定时器或者Thread子线程 具体如何选择看自己的

    2024年02月08日
    浏览(37)
  • C# int[,] 和 int[,,]

    如标题; 在C#中这两个是定义二维和三维数组的;这和C语言的写法不同; C语言定义二维数组是,     int a[5][3]; 看下C#的多维数组;输出数组其中一个值;    

    2024年02月12日
    浏览(36)
  • 【C#】Int32.Parse()、Int16.Parse()

    Int32.Parse() 和 Int16.Parse() 都是 C# 中用于将字符串转换为整数的方法,分别用于处理 32 位整数和 16 位整数。以下是它们的解释: Int32.Parse() : Int32 是 C# 中的数据类型,表示 32 位整数(有符号整数)。 Int32.Parse() 方法用于将字符串转换为 Int32 类型的整数。 例如: Int16.Parse()

    2024年01月19日
    浏览(46)
  • C#中Enumerable.Range(Int32, Int32) 方法用于计算

    目录 一、关于Enumerable.Range(Int32, Int32) 方法 1.定义 2.Enumerable.Range()用于数学计算的操作方法 3.实例1:显示整型数1~9的平方 4.实例2:显示整型数0~9 5.实例3:Enumerable.Range()vs for循环  (1)使用Enumerable.Range() (2)使用for循环 (3)再用Enumerable.Range() (4)再用Enumerable.Range

    2024年01月20日
    浏览(41)
  • c#获取Web.Config中的值出现的错误及解决办法

    1.错误提示 2.原因寻找 问题出在Web.Config文件中 图示如下: 3.改正代码如下: ettings

    2024年04月11日
    浏览(43)
  • 解决Python中的“模块未找到错误:没有名为’sklearn’的模块”的问题

    解决Python中的“模块未找到错误:没有名为’sklearn’的模块”的问题 在使用Python时可能会遇到ModuleNotFoundError: No module named ‘sklearn‘这样的错误,这意味着Python无法找到所需的模块。在这种情况下,通常是因为安装的模块不正确或者没有安装该模块。有几种方法可以解决这个

    2024年02月15日
    浏览(46)
  • C# int和uint类型学习

    在C#中,使用int表示整数类型,对应于.NET的System.Int32结构; C#中的int类型占4字节(4*8=32位)内存空间,其范围从-2,147,483,648 到 2,147,483,647; int类型是默认的整数类型,并且默认值是0; uint类型也是整数类型,占4字节(32位)内存空间,范围是0-4294967295之间的正整数,对应于.NET的

    2024年02月12日
    浏览(38)
  • C# 枚举和集合练习

    Lumberjack.cs类: Main方法: Card.cs类: Suits集合: Values集合: CardComparerByValue.cs Main方法: RetiredPlayer.cs类: Main方法: Breeds.cs: Dog.cs: Main方法: Duck.cs类: DuckComparer.cs DuckComparerByKind.cs DuckComparerBySize.cs Program.cs

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包