我正在使用Umbraco CMS,它将很多数据保存为字符串。在C#中比较字符串与整数
有时候我需要比较储值字符串值(这是存储为一个字符串一个int),以枚举,但它是最好比较它们作为字符串:
if (stringValue == ((int) Enum.Option).ToString()){
}
还是要解析并作为整数比较:
if (int.Parse(stringValue) == (int) Enum.Option){
}
或者只是无所谓!
我正在使用Umbraco CMS,它将很多数据保存为字符串。在C#中比较字符串与整数
有时候我需要比较储值字符串值(这是存储为一个字符串一个int),以枚举,但它是最好比较它们作为字符串:
if (stringValue == ((int) Enum.Option).ToString()){
}
还是要解析并作为整数比较:
if (int.Parse(stringValue) == (int) Enum.Option){
}
或者只是无所谓!
您应该比较其原生/规范形式的数据。所以使用整数。在这种情况下,表现通常是二阶关注。正确性是第一位的。
是的,但也要记住防止/处理来自字符串 - >转换的可能异常。 – davenewza 2012-07-30 11:15:15
如果你比较枚举,它会更好。
也许你想尝试使用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”。
该字符串是“存储为字符串的int”,因此将该字符串解析为“enum”将失败。 – dasblinkenlight 2012-07-30 11:20:40
@dasblinkenlight没有测试过,但我相信你错了。备注第一行:'value参数包含枚举成员的基础值或命名常量的字符串表示形式,或由逗号(,)分隔的命名常量列表。' – Reniuz 2012-07-30 11:29:53
+1哇,[这是最意想不到的结果]( http://ideone.com/MJJ3q)! – dasblinkenlight 2012-07-30 11:33:36
对于代码的可读性起见,我会选择第二种方法:它使,毫无疑问,你的字符串应包含在那个特定的上下文中的整数,而你把它当作这样的。如果你的字符串不是是一个整数?第二个块会抛出,第一个块会默默行动,就像你的数据和枚举不同)。
而且,如前所述,比较整数始终是更好的性能代价比比较字符串,但我相信不会有在这种情况下很多现实世界的区别。
从
int
铸造到enum
是非常便宜...它会比字典查找更快。基本上它是无操作的,只是将这些位拷贝到一个不同名义类型的位置。将字符串解析为枚举值会稍微慢一些。
如果您引用了某些内容,请添加引用。 – Reniuz 2012-07-30 11:18:17
如果你想检查的有效性,可以使用
int value;
Option option;
if (int.TryParse(stringValue, out value) &&
Enum.IsDefined(typeof(Option), value)) {
option=(Option)value;
}
如果你也做了“大于”比较,指出,“20”比“100”大。 – 2012-07-30 11:13:03