2012-07-15 89 views
10

我想知道.NET框架(或其他地方)中是否有任何帮助类将字符转换为ConsoleKey枚举。是否有一个转换方法需要一个char并产生一个ConsoleKey?

e.g 'A' should become ConsoleKey.A 

之前有人问我为什么要这样做。我想编写一个接受字符串的帮助器(例如'Hello World')并将其转换为一系列ConsoleKeyInfo对象。我需要一些疯狂的单元测试,我嘲笑用户输入。

我只是有点厌倦了自己创建胶水代码,所以我想,也许已经有一种方法将char转换为ConsoleKey枚举?

为了完整这里是什么似乎工作的伟大,到目前为止

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

仅用于字符和数字吗?你不能有1对1的映射,因为'ConsoleKey'不区分字符外壳,并且不包含大多数其他的ASCII字符。 – Groo 2012-07-15 20:08:02

+0

是的,这是事实。知道我只有人物和空白。我也会添加句点和逗号。外壳并不重要,因为这些信息将作为char直接保存在ConsoleKeyInfo对象中。 – Christoph 2012-07-16 06:13:33

回答

8

你试过:

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

所以:

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

.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); 

而且Enum.TryParse()an overload to ignore case

+1

'c.ToString()。ToLower()' - 是不是全部*大写*? – Ryan 2012-07-15 20:17:22

+0

@minitech:当然,他们只是一个错字。 – abatishchev 2012-07-15 20:18:32

+0

谢谢,'ToUpper'会更好。在最后一个例子中,'Select'也应该采用两个通用参数类型,'a'应该改为'c'。但是我宁愿让一个异常抛出,而不是吞下字符,因为它可能使它对测试这种方式的恕我直言不那么有用。 – Groo 2012-07-15 20:21:23

-1

如果是[AZ] & [0-9] OP可以使用它

它可能因为ConsoleKey是一个enumeration

所以你可以做这样的事情

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

请解释为什么-1 – HatSoft 2012-07-15 20:02:17

+0

我怀疑它会起作用。例如'(ConsoleKey)“BrowserSearch”'必须抛出异常。 – abatishchev 2012-07-15 20:09:13

+0

@abatishchev请参阅我的更新答案我在完成整个答案之前开始获得-1。 – HatSoft 2012-07-15 20:10:00

相关问题