#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. Это не метод расширения, если это то, что вы хотели написать. Это просто статический метод.