哪种方法更好,更有效:将字符串解析为枚举并进行比较,或者将枚举转换为字符串并进行比较?

时间:2018-08-24 11:32:09

标签: c# enums

这是两个代码:

if (Enum.Parse(typeof(SomeEnum),data["rowName"].ToString()).Equals(SomeEnum.EnumValue))

if (data["rowName"].ToString().Equals(SomeEnum.EnumValue.ToString()))

哪种方法更好,更有效?

2 个答案:

答案 0 :(得分:0)

您可以直接转换为枚举。即:

if ((SomeEnum)data["rowName"] == SomeEnum.EnumValue)

您不想转换为字符串。

注意:通常,当从数据库中提取数据时,它会被正确过滤。

编辑:不太可能将枚举值作为字符串保留在数据库中。期望的类型是整数。如果数据库中存在(例如整数)值而不是枚举值,则不会导致异常。这是使用罗斯文(Northwind)示例数据库的演示(请注意,发件人联邦快递未在Enum值中定义):

void Main()
{
    DataTable tbl = new DataTable();
    using (SqlConnection con = new SqlConnection(@"server=.\SQLEXpress;Database=Northwind;Trusted_Connection=yes"))
    {
        con.Open();
        var reader = new SqlCommand("select * from Orders",con).ExecuteReader();

        while (reader.Read())
        {
            if ((Shipper)reader["ShipVia"] != Shipper.SpeedyExpress)
            {
                Console.WriteLine($@"{(int)reader["OrderId"]}, {(Shipper)reader["ShipVia"]}");
            }
        }
    }

}

public enum Shipper
{
    None,
    SpeedyExpress,
    UnitedPackage
} 

答案 1 :(得分:0)

您可以通过以下方式进行操作。这样一来,如果强制转换出现错误,就可以避免获取InvalidCastException,并且可以优雅地处理它或引发自定义异常。

class Program
{
    static void Main(string[] args)
    {
        var enumAsString = "Value1";
        Enum.TryParse(enumAsString, out SomeEnum enumeration);

        if (enumeration == SomeEnum.Value1)
            Console.WriteLine("success");
    }
}

public enum SomeEnum
{
    Value1,
    Value2
}