Найшвидший спосіб перерахування алфавіту


74

Я хочу переглядати алфавіт так:

foreach(char c in alphabet)
{
 //do something with letter
}

Чи найкращий спосіб зробити це масивом символів? (відчуває себе хакі)

Редагувати: метрика "найменш набирає текст для реалізації, хоча залишається читабельною та надійною"


Кожного разу, коли ви ставите "найкраще" запитання, вам потрібно дати метрики, щоб оцінити їх, інакше всі збираються викинути конкретні відповіді, які, ймовірно, не стосуються вашої унікальної ситуації.
Нік Ларсен

Єдине, що може бути хакі, коли ви це робите, це те, що ви використовуєте цикл foreach замість стандартного циклу for, але навіть тоді це не дуже хакі.
Woot4Moo

Я шукав "акуратніший" спосіб, ніж перерахування масиву символів. Метрика "найменш набирає текст для реалізації, хоча вона все ще є читабельною і надійною" - відповідь Річарда є найближчою до мого оригінального мислення (яке я не міг сформулювати на момент опитування)
Бен Астон,

Відповіді:


162

(Припускає ASCII тощо)

for (char c = 'A'; c <= 'Z'; c++)
{
    //do something with letter 
} 

Крім того, ви можете розділити його на постачальника та використовувати ітератор (якщо ви плануєте підтримати інтернаціоналізацію):

public class EnglishAlphabetProvider : IAlphabetProvider
{
    public IEnumerable<char> GetAlphabet()
    {
        for (char c = 'A'; c <= 'Z'; c++)
        {
            yield return c;
        } 
    }
}

IAlphabetProvider provider = new EnglishAlphabetProvider();

foreach (char c in provider.GetAlphabet())
{
    //do something with letter 
} 

5
Вау ... ніколи про це не думав. Блискуче!
Боббі

14
Якщо ви бачите foreach:Enumerable.Range('a', 'z'-'a' + 1).Select(x=>(char)x)
Роб Фонсека-Енсор

8
Це лише зразок коду, я не можу написати всю заявку у своїй відповіді. FYI, маючи статичний метод, ваше рішення поєднується з класом AlphabetProvider.
Richard Szalay

2
@Rob - ага! Я забув, що звичайні трансляції не працюють між загальними параметрами. Якщо ви пишете власну версію Cast, ви виявите, що компілятор не прийме її, якщо ви не зробите objectпершу. Що робить це перетворенням боксу, тож ви можете отримати лише те, що вклали. Тож я відкликаю свій коментар.
Даніель Ервікер

3
Буде дійсно чудово, якщо ви зможете додати визначення інтерфейсу public interface IAlphabetProvider { IList<string> GetAlphabet(); }у свою публікацію для ясності, оскільки це інтерфейс, який визначає користувач. Першочергово це виглядає так, ніби IAlphabetProviderце вже існуючий інтерфейс у бібліотеці класів .Net framework, і ви просто застосували його для вирішення проблеми OP.
RBT

38

Або ви могли б зробити,

string alphabet = "abcdefghijklmnopqrstuvwxyz";

foreach(char c in alphabet)
{
 //do something with letter
}

2
За допомогою цього рішення інтернаціоналізація стає простою: використовуйте різні літери :) (припускаючи, що символ C # для кожного символу йде буквами, а не 8-бітовою послідовністю). Якщо це не так, я не знаю найкращого підходу для багатобайтових символів в C #.
Joey Adams

@JoeyAdams Для інтернаціоналізації, ви не могли б вийняти жорстко закодований літерал з коду і отримати його через ResourceManager чи щось інше?
Jeff B

1
@JoeyAdams String.GetEnumerator()йде charза символом char, тому у вас буде лише часткова пара кодової точки / сурогатної коди Юнікоду, якщо ваш рядок містить такі символи. Таким чином , ви можете нормалізувати і ваш алфавіт і дані , які ви порівнюєте проти нього і переконайтеся , що ви думаєте , з точки зору числових кодових , а не char: stackoverflow.com/a/28155130/429091
Бінки


5
Enumerable.Range(65, 26).Select(a => new { A = (char)(a) }).ToList().ForEach(c => Console.WriteLine(c.A));

2
Немає сенсу створювати анонімний об’єкт для зберігання одного властивості. А вбудований foreachоператор, як правило, зрозуміліший для виконання дії з кожним елементом послідовності - для цього він призначений.
Даніель Ервікер

Для спрощення: Enumerable.Range (65, 26) .ToList (). ForEach (c => Console.WriteLine ((char) c));
Ераф,

2

Ви можете зробити це:

for(int i = 65; i <= 95; i++)
{
    //use System.Convert.ToChar() f.e. here
    doSomethingWithTheChar(Convert.ToChar(i));
}

Хоча, теж не найкращий спосіб. Можливо, ми могли б допомогти краще, якби знали причину цього.



0

Я знайшов це:

foreach(char letter in Enumerable.Range(65, 26).ToList().ConvertAll(delegate(int value) { return (char)value; }))
{
//breakpoint here to confirm
}

хаотично читаючи цей щоденник і думаючи, що це цікавий спосіб виконати завдання.


6
Сподіваюся, це був жарт. Дійсно :)
mw_21
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.