2012-07-15 10 views
10

Me pregunto si hay alguna clase de ayuda en .NET Framework (o en otro lugar) que convierta caracteres en Console Console enums.¿Hay un método de conversión que toma una char y produce una ConsoleKey?

e.g 'A' should become ConsoleKey.A 

Antes de que alguien pregunte por qué me gustaría hacer eso. Quiero escribir un ayudante que tome una cadena (por ejemplo, 'Hello World') y la convierta en una secuencia de objetos ConsoleKeyInfo. Necesito esto para algunas pruebas de unidades locas donde me burlo de la entrada del usuario.

Estoy un poco cansado de crear código de pegamento por mi cuenta, así que pensé, ¿tal vez ya hay una forma de convertir un char a una consola ConsoleKey?

Para completar esto es lo que parece funcionar muy bien hasta ahora

public static IEnumerable<ConsoleKeyInfo> ToInputSequence(this string text) 
    { 
     return text.Select(c => 
           { 
            ConsoleKey consoleKey; 
            if (Enum.TryParse(c.ToString(CultureInfo.InvariantCulture), true, out consoleKey)) 
            { 
             return new ConsoleKeyInfo(c, consoleKey, false, false, false); 
            } 
            else if (c == ' ') 
             return new ConsoleKeyInfo(' ', ConsoleKey.Spacebar, false, false, false); 
            return (ConsoleKeyInfo?) null; 
           }) 
      .Where(info => info.HasValue) 
      .Select(info => info.GetValueOrDefault()); 
    } 
+2

¿Esto es solo para caracteres y dígitos? No puede tener una asignación de 1 a 1, porque 'ConsoleKey' no distingue la carcasa de caracteres, y no contiene la mayoría de los demás caracteres ASCII. – Groo

+0

Sí, eso es cierto. De acuerdo, lo tengo solo para personajes y espacios en blanco. Agregaré un punto y una coma también. La carcasa no importa porque esta información se conservará en el objeto ConsoleKeyInfo directamente como una char. – Christoph

Respuesta

8

has necesitado:

char a = 'A'; 
ConsoleKey ck; 
Enum.TryParse<ConsoleKey>(a.ToString(), out ck); 

Así:

string input = "Hello World"; 
input.Select(c => (ConsoleKey)Enum.Parse(c.ToString().ToUpper(), typeof(ConsoleKey)); 

o

.Select(c => 
    { 
     return Enum.TryParse<ConsoleKey>(a.ToString().ToUpper(), out ck) ? 
      ck : 
      (ConsoleKey?)null; 
    }) 
.Where(x => x.HasValue) // where parse has worked 
.Select(x => x.Value); 

también tiene Enum.TryParse()an overload to ignore case.

+1

'c.ToString(). ToLower()' - ¿no son todas * mayúsculas *? – Ryan

+0

@minitech: Claro, lo son, solo un error tipográfico. – abatishchev

+0

Gracias, 'ToUpper' funcionará mejor. En el último ejemplo, 'Seleccionar' también debe tomar dos tipos de parámetros genéricos,' a' debe cambiarse a 'c'. Pero prefiero dejar una excepción que tragar caracteres, ya que puede hacer que sea menos útil para probar de esta manera en mi humilde opinión. – Groo

-1

Si se trata de [AZ] & [0-9] OP puede usarlo

Podría trabajo porque ConsoleKey es un enumeration

por lo que puede hacer algo como esto

char ch = 'A'; 
ConsoleKey ck = (ConsoleKey) ch; 
+5

Explique por qué -1 – HatSoft

+0

Dudo que funcione. Por ejemplo '(ConsoleKey)" BrowserSearch "' debe lanzar una excepción. – abatishchev

+0

@abatishchev por favor vea mi respuesta actualizada Comencé a obtener -1 antes de terminar la respuesta completa. – HatSoft

Cuestiones relacionadas