【问题标题】:How to compare enum array values and console input?如何比较枚举数组值和控制台输入?
【发布时间】:2019-11-02 09:27:12
【问题描述】:

如何检查是否有用户从控制台输入的值。

我有五个枚举值:

enum Fruits
{
    apple = 1,
    orange,
    banana,
    chery,
    kiwi
}

并创建了一个包含这些值的数组:

Array arrayFruits = Enum.GetValues(typeof(Fruits));

如下代码:

Console.WriteLine("Enter plant");
string plantNotLow = Console.ReadLine();
string plant = plantNotLow.ToLower();

object element = Enum.Parse(typeof(Fruits), plant);
Fruits fruit = (Fruits)element;

Array arrayFruits = Enum.GetValues(typeof(Fruits));

for (int i = 0; i < arrayFruits.Length; i++)
{
    if(arrayFruits.GetValue(i) == element)
    {

    }
}

例如用户输入“apple”,if-block如何输入?

【问题讨论】:

  • 专门测试苹果:if (element == Fruits.apple)。 - 不确定这是不是你的意思。请注意,arrayFruits 实际上是 Fruits[] - 将其转换为更容易使用
  • 当我进入控制台“apple”时,它应该与枚举数组(如枚举类型或对象类型)进行比较?还是我想错了……?
  • 我无法解析那句话;我也许可以提供帮助,但我首先需要了解您要做什么。如果您想与每个定义的枚举值进行比较,那么就像我说的:将数组转换为Fruits[],然后只需测试thatTypedArray[i]==fruit - 或使用Array.IndexOf
  • 我的意思是,为什么我的代码错了她 if((arrayFruits.GetValue(i) == element) ?因为我需要将用户输入与 enum_Array 的任何元素进行比较,如果存在 e ,g, apple 我可以传递给 if-block 代码
  • 因为== 很复杂并且不会按照您的想法进行操作,因为您使用的是object。请注意,.Equals 而不是 == 应该可以工作,但是 - 我一直这么说 - 将数组转换为 Fruits[] 也可以。 object 上的 == 与两个枚举之间的 == 非常不同。

标签: arrays .net enums


【解决方案1】:

这里的主要问题是这一行中的==

if(arrayFruits.GetValue(i) == element)

具体来说,因为arrayFruitsArray 而不是Fruits[],所以这是一个object == 测试,它是与新装箱值的引用比较,它永远不会返回true(它是引用相等)。

解决方案:

  1. 将数组转换为Fruits[] 并使用typedArray[i] == fruit - 然后使用整数相等比较两个枚举,或者
  2. 在处理object时使用Equals而不是==

第一个选项是迄今为止更好的选择。

【讨论】:

    【解决方案2】:

    投射到水果:

    if ((Fruits)arrayFruits.GetValue(i) == (Fruits)element)
    

    【讨论】:

    • 请注意,这涉及到一个盒子和拆箱/类型检查,以及一个间接向量查找(如果不涉及一些更高级的概念,很难解释这意味着什么,但是 - “不是很好” )。如果可能的话,您应该更愿意将数组本身转换一次,这样可以避免所有这些混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多