2012-07-15 30 views
10

Tôi tự hỏi nếu có bất kỳ lớp trợ giúp nào trong khung công tác .NET (hoặc ở một nơi khác) có thể chuyển đổi các ký tự thành các bảng điều khiển ConsoleKey.Có phương pháp chuyển đổi nào lấy một char và tạo ra một ConsoleKey không?

e.g 'A' should become ConsoleKey.A 

Trước khi ai đó hỏi lý do tôi muốn làm điều đó. Tôi muốn viết một trình trợ giúp có một chuỗi (ví dụ: 'Hello World') và chuyển đổi nó thành một chuỗi các đối tượng ConsoleKeyInfo. Tôi cần điều này cho một số bài kiểm tra đơn vị điên mà tôi đang chế nhạo đầu vào của người dùng.

Tôi chỉ là một chút mệt mỏi của việc tạo ra mã keo trên của riêng tôi vì vậy tôi nghĩ, có lẽ đã có một cách để chuyển đổi một char thành một ConsoleKey enum?

Đối với đầy đủ ở đây là những gì có vẻ công việc tuyệt vời cho đến nay

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

Đây có phải là ký tự và chữ số không? Bạn không thể có ánh xạ 1 đến 1 vì 'ConsoleKey' không phân biệt ký tự vỏ và không chứa hầu hết các ký tự ASCII khác. – Groo

+0

Đúng vậy. Phải biết tôi có nó chỉ cho nhân vật và khoảng trắng. Tôi cũng sẽ thêm dấu chấm và dấu phẩy. Lớp vỏ không quan trọng vì thông tin này sẽ được giữ nguyên trong đối tượng ConsoleKeyInfo trực tiếp dưới dạng char. – Christoph

Trả lời

8

Các bạn đã thử:

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

Vì vậy:

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

hoặc

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

Cũng Enum.TryParse()an overload to ignore case.

+1

'c.ToString(). ToLower()' - không phải tất cả đều là * chữ hoa *? – Ryan

+0

@minitech: Chắc chắn, chúng chỉ là một lỗi đánh máy. – abatishchev

+0

Cảm ơn, 'ToUpper' sẽ hoạt động tốt hơn. Trong ví dụ cuối cùng, 'Select' cũng nên dùng hai kiểu tham số chung,' a' sẽ được thay đổi thành 'c'. Nhưng tôi thà để cho một ngoại lệ được ném hơn so với ký tự nuốt, vì nó có thể làm cho nó ít hữu ích để thử nghiệm theo cách này IMHO. – Groo

-1

Nếu nó là [AZ] & [0-9] OP có thể sử dụng nó

Nó có thể hoạt động vì ConsoleKey là một số enumeration

để bạn có thể làm việc như thế này

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

Vui lòng giải thích lý do tại sao -1 – HatSoft

+0

Tôi nghi ngờ nó sẽ hoạt động. Ví dụ '(ConsoleKey)" BrowserSearch "' phải ném một ngoại lệ. – abatishchev

+0

@abatishchev vui lòng xem câu trả lời cập nhật của tôi Tôi bắt đầu nhận được -1 trước khi tôi hoàn thành toàn bộ câu trả lời. – HatSoft

1

Nếu bạn sử dụng .NET4 hoặc mới hơn, bạn có thể sử dụng Enum.TryParse. và Enum.Parse là có sẵn cho .NET2 trở lên.

Các vấn đề liên quan