Список символов от A до Z из Enumerable.Диапазон

#c# #.net #linq

#c# #.net #linq

Вопрос:

Я хочу составить список из Enumerable.Диапазон. Правильный ли этот код?

 SurnameStartLetterList = new List<char>();
Enumerable.Range(65, 26).ToList().ForEach(character => SurnameStartLetterList.Add((char)character));
  

Или есть лучший способ создать список такого типа?

Комментарии:

1. new List<char> { 'A', 'B', ... 'Z' } Теперь я заткнусь.

2. Но я должен сказать вот что: разве ваш не должен Range() быть Range(65, 26) таким? Второй параметр — это не конечное число, это длина диапазона.

3. Вы правы. Я заметил и немедленно исправил это.

Ответ №1:

Может быть, вот так?

 var surnameList = Enumerable.Range('A', 'Z' - 'A'   1).
                     Select(c => (char)c).ToList();
  

Комментарии:

1. Мне действительно нравится это решение, моя первоначальная реакция была ни в коем случае, это невозможно сделать таким образом , но достаточно уверенным.

2. Нравится.. верните все заглавные буквы на норвежском языке 🙂

3. Ах, это совершенно другая проблема 🙂 Я попытался просто перебрать все 65536 символьных значений, идентифицируя символы верхнего регистра в категории Letter, в итоге получилось 937 символов. Думаю, это несколько больше, чем норвежский алфавит. Enumerable.Range(0, 65536).Select(c => (char)c).Where(c => char.IsLetter(c)).Where(c => char.IsUpper(c))

4. В Юникоде их больше, чем 65536, хотя, если быть точным, 109384 в юникоде 6. Адресное пространство является 32-разрядным. .NET, похоже, не предоставляет никаких средств для возврата всех букв языка, поэтому не уверен, как это будет достигнуто.

Ответ №2:

Ну, string есть IEnumerable<char> , так что это тоже сработало бы:

 "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToList()
  

Вы должны взвесить все за и против этого.

Плюсы:

  • Приведенный выше код читать проще, чем ваш цикл (субъективно, это было мое мнение)
  • Более короткий код (но, вероятно, недостаточно для учета многого)

Минусы:

  • Сложнее читать, если вы не знаете, что .ToList() будете делать со строкой
  • Могут быть ошибки, например, вы бы легко обнаружили ошибку здесь:

     "ABCDEFGHIJKLMN0PQRSTUVWXYZ".ToList()
      

    Под «легко» я подразумеваю, что вы бы заметили ошибку, просто прочитав код, а не если бы знали, что здесь есть проблема, и отправились на ее поиски.

Комментарии:

1. Хахах! Я допустил ошибку, скопировав вторую версию, которую вы опубликовали (с номером 0 ). Я очень рад, что уловил это сразу, прежде чем начал рвать на себе волосы!

2. И если ваша цель могла бы обойтись IList<char> вместо List<char> , вы могли бы просто использовать "ABCDEFGHIJKLMNOPQRSTUVWXYZ" напрямую.

3. Ах, проблемы с «волшебными» строками. Возможно, цикл с комментарием?

Ответ №3:

Я взял ответ Can и создал функцию расширения:

 public static IEnumerable<char> Range(char start, char end)
{
  return Enumerable.Range((int)start, (int)end - (int)start   1).Select(i => (char)i);
}
  

Использование:

 Console.WriteLine(Range('a', 'f').Contains("Vive La France!"[6]));
  

Комментарии:

1. Это не метод расширения, если это то, что вы хотели написать. Это просто статический метод.