2012-07-30 74 views
4

我正在使用Umbraco CMS,它将很多数据保存为字符串。在C#中比较字符串与整数

有时候我需要比较储值字符串值(这是存储为一个字符串一个int),以枚举,但它是最好比较它们作为字符串:

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

还是要解析并作为整数比较:

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

或者只是无所谓!

+1

如果你也做了“大于”比较,指出,“20”比“100”大。 – 2012-07-30 11:13:03

回答

4

您应该比较其原生/规范形式的数据。所以使用整数。在这种情况下,表现通常是二阶关注。正确性是第一位的。

+1

是的,但也要记住防止/处理来自字符串 - >转换的可能异常。 – davenewza 2012-07-30 11:15:15

0

如果你比较枚举,它会更好。

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可以“选项”“0”

+0

该字符串是“存储为字符串的int”,因此将该字符串解析为“enum”将失败。 – dasblinkenlight 2012-07-30 11:20:40

+0

@dasblinkenlight没有测试过,但我相信你错了。备注第一行:'value参数包含枚举成员的基础值或命名常量的字符串表示形式,或由逗号(,)分隔的命名常量列表。' – Reniuz 2012-07-30 11:29:53

+0

+1哇,[这是最意想不到的结果]( http://ideone.com/MJJ3q)! – dasblinkenlight 2012-07-30 11:33:36

0

对于代码的可读性起见,我会选择第二种方法:它使,毫无疑问,你的字符串应包含在那个特定的上下文中的整数,而你把它当作这样的。如果你的字符串不是是一个整数?第二个块会抛出,第一个块会默默行动,就像你的数据和枚举不同)。

而且,如前所述,比较整数始终是更好的性能代价比比较字符串,但我相信不会有在这种情况下很多现实世界的区别。

0

int铸造到enum是非常便宜...它会比字典查找更快。基本上它是无操作的,只是将这些位拷贝到一个不同名义类型的位置。

将字符串解析为枚举值会稍微慢一些。

this SO answer

+1

如果您引用了某些内容,请添加引用。 – Reniuz 2012-07-30 11:18:17

0

如果你想检查的有效性,可以使用

int value; 
Option option; 


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