gpt4 book ai didi

c# - 比较两个不同枚举的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-02 15:23:26 24 4
gpt4 key购买 nike

我在想比较两个不同枚举的值的最佳方法是什么。

例子:

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)
{
//...
}
}
}

最佳答案

枚举就像基于整数的常规常量类之上的抽象层。

该抽象包括评估 false,即使两个枚举值是相同的整数但属于不同的枚举类型。

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

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

public enum States
{
Open = 1,
Closed
}

public enum SpecialFolders
{
ProgramFiles86 = 1,
ProgramFiles64
}

States.Open == SpecialFolders.ProgramFiles86 这样的东西有意义吗?潜在地,它们似乎相等(它们不会),因为两个枚举值的基础值都是 1,但是如果枚举类型 1 并不意味着相同不一样。

好像是说...

  1. 面包
  2. 肉类

...等同于:

  1. (面包==偷??????????)

也许……

...您可以破坏将常量键入为枚举的目的,将它们转换为 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)
{
}

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

关于c# - 比较两个不同枚举的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33197100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com