Самый эффективный метод объединения всех букв алфавита в строку

Возможный дубликат:
Создание массива букв алфавита на C #

(Только теоретический вопрос, просто размышлял об этом как о написании системы фильтрации (не с использованием алфавита, но заставил меня задуматься)).

Допустим, я хочу создать список фильтров, состоящий из всех заглавных букв (A – Z) английского алфавита плюс слова «Все».

All A B C D E ... X Y Z 

И преобразовать его в List<string> наиболее эффективный способ сделать это на C # без использования жестко запрограммированного метода {"A","B"}.

Не дубликат Этот вопрос

Перечисленный выше вопрос касается преобразования в простой и простой символьный массив, который не допускает ВСЕ части. И чтобы взять это и преобразовать, я полагаю, потребуется как минимум копирование + приведение.


person John Mitchell    schedule 29.07.2012    source источник
comment
@NikolaAnusev не дубликат, я боюсь, другой использует CharArray, который не поддерживает раздел All, и для использования этого метода потребуется копия + добавление.   -  person John Mitchell    schedule 30.07.2012
comment
Вы, наверное, правы - это не точный дубликат, но я не думаю, что ответы здесь будут сильно отличаться.   -  person Nikola Anusev    schedule 30.07.2012
comment
Почему вы хотите создать список строк для списка символов?   -  person Tim Schmelter    schedule 30.07.2012
comment
@TimSchmelter по первому требованию (добавление слова All в список)   -  person John Mitchell    schedule 30.07.2012
comment
Стоит отметить, что жесткое кодирование было бы наиболее эффективным. Если вы не можете сказать об эффективности, если вы этого не сделаете, то все, что вы чувствуете, независимо от эффективности.   -  person Servy    schedule 30.07.2012


Ответы (5)


Для «максимальной эффективности» старайтесь избегать List<> и LINQ.

  var sb = new StringBuilder("All", 26+3 +spare);
  for (char c = 'A'; c <= 'Z'; c++)  sb.Append(c);

  string result = sb.ToString();

но, честно говоря, вам придется сравнить различные ответы здесь.

person Henk Holterman    schedule 29.07.2012

Вы также можете сделать это с реальными персонажами:

List<string> characters = new List<string>();

for (char c = 'A'; c <= 'Z'; c++)
    characters.Add("" + c);
person Balázs Édes    schedule 29.07.2012
comment
Или измените первую строку на var characters = new List<string>(27) { "All", };. Тогда емкость List<> не нужно будет увеличивать во время цикла. - person Jeppe Stig Nielsen; 30.07.2012

Каждый строковый символ представляет собой значение char, имеющее число в формате ascii. Заглавная буква A начинается с 65, а заглавная Z равна 90. Таким образом, используя цикл, вы можете генерировать значения.

List<string> alpha = new List<string>();
for(int i=65; i <=90; i++) {
   alpha.add(""+(char)i);
}

РЕДАКТИРОВАТЬ:

Вы также можете использовать символьные литералы для цикла for как

for(int i = (int)'A'; i <= (int)'Z'; i++)
person secretformula    schedule 29.07.2012
comment
for(int i = (int)'A'; i <= (int)'Z'; i++) было бы лучше. - person Zong; 30.07.2012
comment
Почему не просто for (char c = 'A'; c <= 'Z'; c++) alpha.Add(c.ToString());? - person Jeppe Stig Nielsen; 30.07.2012

Например:

var alphabet = new List<String>(27);
var capitalRange = Enumerable.Range(0, 26)
    .Select(i => new String(Convert.ToChar(i + 65), 1));
alphabet.AddRange( capitalRange );
alphabet.Add("All");

Обратите внимание, что инициализация списка с правильной емкостью гарантирует, что его размер не нужно изменять и он не будет завышен. Кроме того, это похоже на цикл for. Конструктор строки немного быстрее, чем Char.ToString().

person Tim Schmelter    schedule 29.07.2012

Вот довольно компактный способ сделать это:

var list = new[] { "All" }.Concat(
    Enumerable.Range('A', 'Z' - 'A' + 1)
    .Select(c => ((char)c).ToString())
).ToList();

Но что-то вроде этого чище (IMO) и более эффективно, поскольку нет изменения размера:

const char start_ch = 'A';
const char end_ch = 'Z';

var list = new List<string>(end_ch - start_ch + 1) { "All" };

for (char ch = start_ch; ch <= end_ch; ++ch)
    list.Add(ch.ToString());

Что именно вы собираетесь делать с этим List? Например, поиск можно более эффективно выполнять, используя вместо этого ассоциативную структуру данных, такую ​​как HashSet или Dictionary.

person Branko Dimitrijevic    schedule 29.07.2012
comment
Ничего :) это был теоретический вопрос о микрооптомизации, вот и все. Если бы он просто выводился, я бы, вероятно, использовал массив, если бы он выполнял поиск, это был бы словарь. - person John Mitchell; 30.07.2012