Подтвердить что ты не робот

Как сравнить строку с перечислением в С#

string strName = "John";
public enum Name { John,Peter }

private void DoSomething(string myname)
{
case1:
     if(myname.Equals(Name.John) //returns false
     {

     }

case2:
     if(myname == Name.John) //compilation error
     {

     }

case3:
     if(myname.Equals(Name.John.ToString()) //returns true (correct comparision)
     {

     }
}

когда я использую .Equals, это сравнение ссылок, и когда я использую ==, это означает сравнение значений.

Есть ли лучший код вместо преобразования значения enum в ToString() для сравнения? потому что он разрушает цель перечисления типа значения, а также, ToString() в enum устарел??

4b9b3361

Ответ 1

Вы можете использовать метод Enum.TryParse() для преобразования строки в эквивалентное перечислимое значение (если оно существует):

Name myName;
if (Enum.TryParse(nameString, out myName))
{
    switch (myName) { case John: ... }
}

Ответ 2

Вы можете проанализировать строковое значение и выполнить сопоставление перечислений.

Enum.TryParse: см. http://msdn.microsoft.com/en-us/library/dd783499.aspx

Name result;
if (Enum.TryParse(myname, out result))
{
    switch (result)
    {
        case Name.John:
            /* do 'John' logic */
            break;
        default:
            /* unexpected/unspecialized enum value, do general logic */
            break;
    }
}
else 
{
    /* invalid enum value, handle */
}

Если вы просто сравниваете одно значение:

Name result;
if (Enum.TryParse(myname, out result) && result == Name.John)
{
     /* do 'John' logic */
}
else 
{
    /* do non-'John' logic */
}

Ответ 3

Если вы используете .NET4 или более позднюю версию, вы можете использовать Enum.TryParse. и Enum.Parse доступен для .NET2 и более поздних версий

// .NET2 and later
try
{
    switch (Enum.Parse(typeof(Names), myName))
    {
        case John: ... 
        case Peter: ...
    }
}

// .NET4 and later
Name name;
if (Enum.TryParse(myName, out name))
    switch (name)
    {
        case John: ... 
        case Peter: ...
    }

Ответ 5

Я думаю, что вы ищете метод Enum.Parse().

if(myname.Equals(Enum.Parse(Name.John)) //returns false
 {

 }

Ответ 6

По какой-то причине данные решения не помогли мне. Я должен был сделать несколько иначе:

Name myName;
if (Enum.TryParse<Name>(nameString, out myName))
{
    switch (myName) { case John: ... }
}

Надеюсь, это поможет кому-то:)