2010-04-12 1 views
1

Я пытаюсь преобразовать индекс от 1 до 27 в соответствующую прописную букву. Я знаю, что в C++ могу набрать это:Как преобразовать целые числа в символы в C#?

char letter = 'A' + (char)(myIndex % 27); 

Этот же код не работает на C#. Как я могу выполнить эту задачу на C#?

EDIT: Я бы предпочел не кодировать enum или оператор switch для этого, если есть лучшее математическое решение, подобное выше.

+0

char letter = Convert.ToChar (myIndex); –

ответ

8

Когда вы добавляете (или вычитаете) два символа, лет u получить Int32 в C#. Это будет работать:

int letter = 'A' + (char)(myIndex % 27); 

Если вы хотите полукокса, вам необходимо явно привести его снова:

char letter = (char) ('A' + (char)(myIndex % 27)); 

Однако это, скорее всего, должно быть на самом деле:

char letter = (char) ('A' + (char)((myIndex - 1) % 26)); 
+1

Вы должны s/27/26/g – Vlad

+0

Да, но я хотел сделать эквивалент кода OP. –

+0

@ Vlad: Вам это нравится? –

4
char letter = (char)('A' + (myIndex-1)%26); 

(отредактировать магическое число, скорректированные индексы)

+0

Извините, -1 для магических чисел –

+0

О, право. '% 26'. Благодарю. Наверное, я делал это сложнее, чем нужно. –

2

В C#, вы должны сделать свой кастинг немного по-другому:

char letter = (char)('A' + (myIndex % 27)); 

Однако ваша математика может быть неправильным, и это, вероятно, ближе к тому, что вы на самом деле хотите:

char letter = (char)('A' + ((myIndex - 1) % 26)); 
+0

% 27 неверно, должно быть 26 :-) В латинском алфавите только 26 букв. – Vlad

+0

Я вроде скопировал это из исходного кода ... он говорит, что у него есть индекс от 1 до 27 в любом случае. Конечно, чтобы получить правильное латинское письмо, которое он должен делать («A» + (char) ((myIndex - 1)% 26)) –

+0

Действительно, я вижу. С 26 должно работать лучше. – Vlad

0

Это должно работы ...

byte upperA = 65; 
byte index = 1; 

char letter = (char)(upperA + (index % 27)); 

Console.WriteLine(letter); 

Я также как ответ Рида.

6

Вот таблица приводится решение:

char ToUpperChar(int index) 
{ 
    if (index < 1 || index > 26) 
     throw new ArgumentOutOfRangeException("index"); 

    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[index-1]; // took out the % - it's range-checked above. 
} 
+0

+1 для более оригинального подхода. поэтому многие типы литья стали скучными;) И это чисто математическое, поскольку индексирование массива является синтаксическим сахаром для арифметики указателей. –

1

Как насчет метода расширения?

public static int Index(this char letter) 
    { 
     const int offset = 64; 
     if(letter >= 'A' && letter <= 'Z') 
      return (Convert.ToInt32(letter) - offset); 
     return 0; 
    } 

// использование ... символ буква = 'A'; int index = letter.Index();

+0

Извините! Неправильный способ. Попробуй это... public static char CharToIndex (этот номер int) { const int offset = 64; if (number> = 1 && number <= 26) return (Convert.ToChar (number + offset)); return '\ 0'; } // Использование ... int i = 1; char c = i.CharToIndex(); – soulia