如何比较两个不同的枚举类型?

3
我想知道比较两个不同枚举值的最佳方法。
例如:
public enum ExampleEnumA
{
    ExampleValue
}

public enum ExampleEnumB
{
    ExampleValue
}

 if (ExampleEnumA.ExampleValue.ToString() == ExampleEnumB.ExampleValue.ToString())
 {

 }

比较字符串是可行的,但我知道这不是最有效和优雅的方式。有什么更好的方法吗?

编辑:

也许这是一个设计缺陷,但这是一个真实项目中的问题,而不是我对枚举的错误理解。它看起来像这样,没有时间重构整个方法。

public interface IProvider
{
    Enum SectionType { get; }
}

public class FirstProvider : IProvider
{
    public Enum SectionType
    {
        get { return ExampleEnumA.ExampleValue; }
    }
}

public class SecondProvider : IProvider
{
    public Enum SectionType
    {
        get { return ExampleEnumB.ExampleValue; }
    }
}

public class Program
{
    public void TmpMethod(Enum sectionType)
    {
        var provider = GetFromIoC...

        if (provider.SectionType == sectionType)
        {
            //...
        }
    }
}

枚举类型的“标签”在每个独立的枚举中是否具有相同的(int)值? - undefined
你期望什么,枚举类型唯一的区别就在于标签,因为它们基于 int*。所以除了通过它们的标签比较之外,其他任何方式都是不可能的,因为它们的标签赋予了它们语义上的意义,而不会有其他的。另外,你怎么能说 apple_pie 和 apfel_kuchen 是相同的呢? - undefined
你能详细说明一下你想要实现的目标吗?我找不到一个好的例子来展示如何在语义上正确地比较两个不同的枚举。 - undefined
您需要解释您的比较标准是什么。如果“相等”意味着“具有相同的枚举成员名称”,那么您的方法可以接受。如果您想要比较底层的数值,您可以在数值上进行比较。_"最高效和优雅"_ 实际上无法量化,我确信这不会造成具体的效率问题,因为使用您的代码,您仍然可以每秒比较数百万个枚举。 - undefined
枚举在运行时是常量,所以像这样比较它们对我来说没有多大意义,除非它们被标记了。那样才有意义。 - undefined
1个回答

7

枚举是基于整数常量的普通类之上的抽象层。

这种抽象包括在不同枚举类型中,即使两个枚举值具有相同的整数但属于不同的枚举类型,也要进行false的评估。

如何比较具有相同基础值的两个不同枚举类型?我会回答:如果您需要执行此评估,则应该是一个设计缺陷

例如,假设我们已经实现了这些枚举:

public enum States
{
    Open = 1, 
    Closed
}

public enum SpecialFolders 
{
     ProgramFiles86 = 1,
     ProgramFiles64
}

希望这样写会更有意义:States.Open == SpecialFolders.ProgramFiles86?它们看起来可能相等(但实际上不是),因为两个枚举值都具有基础值1,但如果枚举类型不同,则1的含义并不相同。

这就像说...

  1. 面包

...和下面的东西是一样的:

  1. (面包==偷??????)
  2. 木头

也许...

...你可以通过将常量强制转换为int来打败枚举的目的:

if ((int)ExampleEnumA.ExampleValue == (int)ExampleEnumB.ExampleValue)
{

}

如果底层类型是int,它也可以是long

public enum SomeEnum : long 
{
}

...而且您需要将评估的左右部分转换为long,等等。

无论如何,我坚持认为您不应该这样做。也许您应该使用常量的常规类,这样您就可以避免每次评估2次转换:

public static class States
{
     public const int Open = 1;
     public const int Closed = 2;
}

public static class Materials
{
    public const int Steel = 1;
    public const int Wood = 1;
}

// true! but not that true... I can't understand why these constants equal...
if(States.Open == Materials.Wood)
{
}

顺便说一下,我仍然认为这是一个设计缺陷,你应该避免不使用枚举来解决糟糕的设计决策。


你的例子似乎是在比较苹果和橙子。但有些情况下,你需要比较略有不同的苹果,这并不构成设计缺陷。考虑以下例子:两个对象分别具有自己的内部枚举。一些值的顺序可能不同,它们可能还有其他值。例如:(enum{ whiteApple, redApple} vs. enum{ redApple, whiteApple, greenApple})。我仍然需要一种方法来获取这两者之间的共同点,而这些共同点来自于这些封装对象之外。注意:这两个对象位于不同的库中。 - undefined
枚举的基本概念是将其表示为整数或兼容类型,如果你在设计中需要比较两个枚举值,那么这很可能是一个设计缺陷。 - undefined
考虑这个案例。你还认为将enum PieceType {BLACK, WHITE, NONE}enum PlayerTyper {BLACK, WHITE}进行比较是一个设计缺陷吗? - undefined
@SebastianNielsen 可能吧。我们应该问问自己为什么在这种情况下有两个enum。如果只有一个PieceType,并且可以在棋子和玩家方面重复使用,那就更合理了... - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接