Какой подход лучше и эффективнее: проанализировать строку для перечисления и сравнить или преобразовать перечисление в строку и сравнить? - PullRequest
0 голосов
/ 24 августа 2018

Вот оба кода:

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

Или

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

Какой подход лучше и эффективнее?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Вы можете сделать это следующим образом. Таким образом, вы можете избежать получения 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
}
0 голосов
/ 24 августа 2018

Вы можете напрямую привести к перечислению. то есть:

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

Вы не хотите преобразовывать в строку.

Примечание. И, как правило, оно фильтруется при извлечении данных из базы данных.

РЕДАКТИРОВАТЬ: Маловероятно, что значения enum будут храниться в базе данных в виде строки. Ожидаемый тип является целым числом. Это не приведет к исключению, если в базе данных есть значение (скажем, целое число), которого нет в значениях перечисления. Вот демонстрационный пример с использованием базы данных Northwind (обратите внимание, что грузоотправитель Federal Express не определен в значениях 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
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...