【问题标题】:How to assign two Enumeration values to one string?如何将两个枚举值分配给一个字符串?
【发布时间】:2013-06-12 17:53:11
【问题描述】:

这是我目前的代码:

enum values { one, two, three, four, five, six, seven, eight, nine, ten, eleven };
    private void button1_Click(object sender, EventArgs e)
    {
        values Ace = values.one;
        values Ace = values.eleven;
        values King = values.ten;
        values Queen = values.ten;
        values Jack = values.ten;
        values Ten = values.ten;
        values Nine = values.nine;

我希望将 Ace 名称分配给枚举值 1 和 11。我该怎么做?

【问题讨论】:

  • 为什么要使用枚举值?这可能应该由一些漂亮、清晰的 OO 类来表示
  • stackoverflow.com/questions/17052091/… 看到这个问题我选择使用枚举的原因
  • 我将 C# 新手放在我的问题上是有原因的,所以当我不知道如何做时,人们不会抛出大量新词并给出不同的方法和更简单的方法。
  • 枚举是一个非常强大的工具,但在这里没有正确使用,因为你有两个基本相同的值。像 David 和 Amicable 一样,建议创建一个类来表示您的数据。
  • 在我之前的问题中似乎也最忽略了 C# 新手部分,这就是我处于这个阶段的原因

标签: c# enumeration assign


【解决方案1】:

使用bitwise or operator|

values Ace = values.one | values.eleven;

但是,除非你用标志定义你的枚举,否则你会得到非常奇怪的行为。

[Flags]
enum values
{
    one = 0x1,
    two = 0x2,
    three = 0x4,
    four = 0x8,
    six = 0x01,
    seven = 0x02,
    eight = 0x04,
    nine = 0x08,
    ten = 0x001,
    eleven = 0x002
}

除此之外,如果您使用values 枚举来确定点值,并且enum 不是正确的结构。尝试使用int[] 来存储点值。

【讨论】:

  • 他也需要将枚举声明为Flags
  • 定义标志值的诡计,使用左移运算符,你不需要记住你的两个幂(1<<0 == 11<<1 == 21<<2 == 4,等等...)使其更易于阅读。
【解决方案2】:

您可以使用按位或运算符 iif: 你的枚举有一个Flags 属性:

[Flags]
enum values { one, two....}

或者你明确声明价值是flagwise

即:enum{one=1,two=2,three=4,four=8,five=16 ...}

如您所见,通过选择随后的 2 次幂,您可以将每个值设置为一个位:

1= 00000001
2= 00000010
4= 00000100
8= 00001000
16=00010000

使用此策略,您可以按位组合任何标志,二进制表示应该有助于找出原因。 否则按位或运算符将错误地重叠某些值。

请注意,如果您有一个组合值并且您需要检查单个值,那么普通的== 运算符将失败,您必须使用掩码进行检查:

if((value.one & yourvar)!=0)
        ....

【讨论】:

    【解决方案3】:

    您的枚举需要 Flags attribute 并在其上使用或符号 |

    [Flags]
    enum values { one = 1 << 0, two = 1 << 1, three = 1 << 2, four = 1 << 3, five = 1 << 4, six = 1 << 5, seven = 1 << 6, eight = 1 << 7, nine = 1 << 8, ten = 1 << 9, eleven = 1 << 10 };
    
    private void button1_Click(object sender, EventArgs e)
    {
        values Ace = values.one | values.eleven;
        values King = values.ten;
        values Queen = values.ten;
        values Jack = values.ten;
        values Ten = values.ten;
        values Nine = values.nine;
    

    您可能需要修改一些其他代码来处理值现在是Flags 样式枚举的事实(就像我必须定义所有标志值一样)。

    【讨论】:

      【解决方案4】:
      class Card
      {
          public string Name { get; set; }
          public int Values[] { get; set; } // alternatively, an enum
      
          // Examples of how I would expand this for use in a game
          public String Suit { get; set; } // alternatively, an enum.
          public Boolean Dealt { get; set;}
      }
      

      我会使用这样的 OO 方法。

      【讨论】:

      • 当您只是想提供其他枚举值的组合时,这太过分了。
      • 我不同意,枚举标志很危险,它不能正确代表他的域。使用“真实”的 .Net 类将在未来证明他的解决方案并使其更清洁。
      • 好吧,即使在 OOP 中,枚举也被广泛使用。但无论如何,我认为您提出的解决方案并没有为枚举增加太多价值,并且您失去了智能感知和语法检查。
      • 我已经扩展了我的示例以演示可扩展性,因为这是我想到的卡片表示的一种用途。单独的枚举在实际使用中似乎不灵活。
      猜你喜欢
      • 2015-04-06
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2021-07-24
      相关资源
      最近更新 更多