在C#中将字符串与整数进行比较

4

我正在使用Umbraco CMS,它将许多数据保存为字符串。

有时,我需要将存储的值字符串(作为字符串存储的int)与枚举进行比较,但最好的方法是将它们作为字符串进行比较:

if ( stringValue == ( (int) Enum.Option ).ToString() ){
}

或者将其解析为整数并进行比较:
if ( int.Parse(stringValue) == (int) Enum.Option ){
}

或者两种方式都无所谓!如果有任何疑问,请随时联系我们。

1
如果您还进行“大于”比较,请注意“20”大于“100”。 - Hans Kesting
6个回答

4

您应该比较数据的原生/规范形式。因此使用整数。在这种情况下,性能通常是次要关注点。正确性是第一位的。


1
是的,但也要记得防止/处理字符串转换为整数时可能出现的异常。 - Dave New

3
也许你想尝试使用Enum.Parse
enum MyEnum
{ 
  Option,
  Option1 = 1, 
  Option2 = 2
}

string stringValue = "0";
if((MyEnum)Enum.Parse(typeof(MyEnum), stringValue) == MyEnum.Option)
{
   //Do what you need
}

注意:
值参数包含枚举成员底层值或命名常量的字符串表示形式,或由逗号(,)分隔的命名常量列表。
因此,stringValue可以是"Option"或"0"。

该字符串是“一个以字符串存储的整数”,因此将该字符串解析为枚举类型会失败。 - Sergey Kalinichenko
@dasblinkenlight 没有测试过,但我认为你是错的。第一行注释:value 参数包含枚举成员底层值或命名常量的字符串表示形式,或由逗号(,)分隔的命名常量列表。 - Renatas M.
还有一个不错的技巧:如果值是一个列表,返回值将是指定名称的值与按位 OR 操作组合的结果。 - Renatas M.
你可能想要提到能够将表示枚举值的数字字符串传递给“Parse”方法。我相信这对许多人来说都是新的,即使他们知道“Parse”方法的存在。 - Sergey Kalinichenko
请尝试泛型版本的 Enum.TryParse<T>(string, out T) - abatishchev

0
如果你想检查有效性,你可以使用。
int value;
Option option;


if (int.TryParse(stringValue, out value) &&
    Enum.IsDefined(typeof(Option), value)) { 
    option=(Option)value;
}

0

如果您能比较枚举,则会更好。


0
为了代码可读性,我会选择第二种方法:它清楚地表明你的字符串在特定上下文中应该包含一个整数,并且你正在将其视为这样处理。
第二种方法还允许您更深入地处理错误情况(如果您的字符串不是整数怎么办?第二个块会抛出异常,而第一个块则会像您的数据与枚举不同一样静默操作)。
此外,正如已经说明的那样,比较整数在性能方面总是优于比较字符串,但我相信在这种情况下实际上不会有太大的差异。

0
int强制转换为enum非常便宜... 它将比字典查找更快。 基本上它是一个空操作,只是将位复制到具有不同概念类型的位置。
将字符串解析为枚举值会慢一些。
来自此SO答案

1
如果您引用了某些内容,请添加参考文献。 - Renatas M.

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