简体   繁体   English

C# 如何将控制台输入的字符串转换为枚举

[英]C# how to convert string input from console to an enum

I'm trying to convert a string that i receive from the user via Console.ReadLine();我正在尝试转换我通过 Console.ReadLine(); 从用户那里收到的字符串。 into an enum, this is the code i tried so far.进入枚举,这是我到目前为止尝试过的代码。 I keep getting the error that im using an unassigned local variable, any advice is welcomed.我不断收到错误消息,提示我使用未分配的局部变量,欢迎任何建议。

static Manager CreateNewManager()
    {
        Console.Write("Insert Id: ");
        int managerID = int.Parse(Console.ReadLine());

        Console.Write("Insert First Name: ");
        string firstName = Console.ReadLine();

        Console.Write("Insert Last Name: ");
        string lastName = Console.ReadLine();

        Console.Write("Insert Department");
        string department = Console.ReadLine();

        Console.Write("Select gender (M or F): ");
        string gender = Console.ReadLine();
        Gender genderEnum;
        if(gender == "M")
        {

             genderEnum = Gender.Male;
        }
        else if (gender == "F")
        {
             genderEnum = Gender.Female;
        };

        Console.Write("Insert Salary");
        int salary = int.Parse(Console.ReadLine());

        Manager newManager = new Manager(managerID, department, salary, firstName, lastName, genderEnum);
        return newManager;

I'd like to elaborate on previous answers. 我想详细说明以前的答案。 There are three typical ways of doing this: 有三种典型的方法:

1) Declare an Unknown in your enum (as per previous answers). 1)在您的枚举中声明一个Unknown (按照之前的答案)。 The downside to this is that it potentially has far-reaching implications. 不利的一面是它可能具有深远的影响。 For example, you may only have this particular Unknown condition when processing input, but you may need to use your Gender enum all throughout your application, including lots of cases where Unknown is simply not a valid value. 例如,在处理输入时,您可能仅具有此特定的“ Unknown条件,但是您可能需要在整个应用程序中全部使用Gender枚举,包括很多情况下“ Unknown根本不是有效值。 By declaring an Unknown member in your enum, it becomes difficult to look at a piece of code far away from this input code and determine if you need to handle the Unknown option. 通过在枚举中声明一个Unknown成员,很难查看远离此输入代码的一段代码并确定是否需要处理Unknown选项。

enum Gender { Male, Female, Unknown }

...

Gender genderEnum;
if (gender == "M")
    genderEnum = Gender.Male;
else if (gender == "F")
    genderEnum = Gender.Female;
else
    genderEnum = Gender.Unknown;

2) Use a Nullable . 2)使用Nullable The example below uses the ? 下面的示例使用? syntax . 语法 The upside to this approach is that you have a cleaner enum. 这种方法的好处是您可以使用更干净的枚举。 There may be many places in your code where this "unknown" gender isn't possible. 您的代码中可能有很多地方无法实现这种“未知”性别。 For example, if you evaluate the input once and reject any invalid genders, then any piece of code which requires a valid gender would not need to worry about a third option. 例如,如果您一次评估输入并拒绝任何无效的性别,那么任何需要有效性别的代码段都无需担心第三个选项。 Code that needs a specific well-defined gender can use Gender and code that uses a potentially unknown gender can use Gender? 需要特定明确定义的性别的代码可以使用Gender ,而使用可能未知的性别的代码可以使用Gender? .

enum Gender { Male, Female }

...

Gender? genderEnum;
if (gender == "M")
    genderEnum = Gender.Male;
else if (gender == "F")
    genderEnum = Gender.Female;
else
    genderEnum = null;

3) Throw an exception. 3)抛出异常。 The upside to this is that you immediately reject invalid input. 这样做的好处是您会立即拒绝无效输入。 Make sure you handle your exceptions appropriately. 确保适当处理异常。

enum Gender { Male, Female }

...

Gender genderEnum;
if (gender == "M")
    genderEnum = Gender.Male;
else if (gender == "F")
    genderEnum = Gender.Female;
else
    throw new ApplicationException("Invalid gender input.");

Look at that piece of code: 看一段代码:

    Gender genderEnum;
    if(gender == "M")
    {

         genderEnum = Gender.Male;
    }
    else if (gender == "F")
    {
         genderEnum = Gender.Female;
    };

What happens if the user enters something different than 'M' or 'F'? 如果用户输入的内容不同于“ M”或“ F”,会发生什么? genderEnum would still not be assigned. genderEnum仍然不会分配。 But you try to use it anyway: 但是您还是尝试使用它:

Manager newManager = new Manager(managerID, department, salary, firstName, lastName, genderEnum);

This causes the compiler error. 这会导致编译器错误。

Initialize your genderEnum (and add that case Unknown to your enum Gender ): 初始化您的sexEnum(并将该案例Unknown添加到您的enum Gender ):

Gender genderEnum = Gender.Unknown;

C# requires that all local variables are guaranteed to be assigned before they can be referenced. C#要求在引用所有局部变量之前,必须确保它们已被赋值。 Because you are declaring genderEnum without instantiating it: 因为您是在未实例化的情况下声明了genderEnum

Gender genderEnum;

You need to make sure that it is assigned a value before the line where you reference it: 您需要确保在为其引用的行之前为其分配了一个值:

Manager newManager = new Manager(managerID, department, salary, firstName, lastName, genderEnum);

However, in your if-elseif chain: 但是,在if-elseif链中:

if (gender == "M")
{
     genderEnum = Gender.Male;
}
else if (gender == "F")
{
     genderEnum = Gender.Female;
}

genderEnum could come away without a value if gender is neither "M" or "F" . 如果社会gender既不是"M"也不是"F"则没有值的genderEnum可能会消失。 In order for the guarantee to hold true, you either need to initialize genderEnum when you declare it: 为了使保证成立,您需要在声明时初始化genderEnum

Gender genderEnum = Gender.Unknown; // Or whatever other default value

or you need an else block as well: 或者您还需要一个else块:

else
{
    genderEnum = Gender.Unknown; // Or whatever other default value
}

I wrote this, maybe is useful for someone.我写了这个,也许对某人有用。

public function TEnum GetConsoleEnumerator<TEnum>( )  where TEnum : Enum
    {
        do
        {
            Console.Write( "option ---> " );
            var response = Console.ReadLine( ).Trim( );
            var valueIsContained = Enum.IsDefined( typeof( TEnum ), response );
            if ( !valueIsContained )
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine( "Invalid, try again" );
                Console.ResetColor( );
            }
            else
                return (TEnum)Enum.Parse( typeof( TEnum ), response, true );
        }
        while ( true );
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM