yield return пустой символьный литерал

Я пишу метод расширения Linq, чтобы сделать p455w0rd из строкового ввода.

public static IEnumerable<char> ToPasswordFormat(this IEnumerable<char> source)
{
        var enumerator = source.GetEnumerator();
        while (enumerator.MoveNext())
        {
            switch((char)enumerator.Current)
            {
                case 'a':
                    yield return '4';
                    break;
                case 'e':
                    yield return '3';
                    break;
                case 'l':
                    yield return '7';
                    break;
                case 'i':
                    yield return '!';
                    break;
                case ' ':
                    yield return '';
                    break;
                default:
                    yield return (char)enumerator.Current;
                    break;
            }
        }
}

как видите, я хочу удалить пробелы, но когда я использую yield return '';, я получаю ошибку Empty character literal.

Что такое '' и как я могу вернуть yield return ничто?


person happygilmore    schedule 03.04.2013    source источник
comment
Просто не уступайте ничего, продолжайте цикл while. т.е. case ' ': break;   -  person George Duckett    schedule 03.04.2013
comment
Вы можете вернуть '\0'. stackoverflow.com/a/3670513/284240   -  person Tim Schmelter    schedule 03.04.2013
comment
Вместо того, чтобы использовать гигантский switch, я предлагаю вам просто построить Dictionary<char, char> для сопоставления значений; будет намного проще.   -  person Servy    schedule 03.04.2013


Ответы (2)


Вы не можете yield return nothing. Решением было бы не возвращать return, если это пробел. Закомментируйте эту строчку, и все будет хорошо.

'' бессмысленно. Компилятор пожалуется. Нет такого понятия, как «отсутствие персонажа».

person nvoigt    schedule 03.04.2013
comment
+1 Ключ в том, что с учетом '1','2',' ','3' вам не нужна последовательность вроде '1','2','','3'. Вам вообще не нужно ничего заменять ' ', поэтому просто не yield ничего. - person George Duckett; 03.04.2013
comment
There is no such thing as "no character". Ну, вообще-то, есть. '\0'. Нулевой символ. Тем не менее, его не следует использовать в этом контексте. - person Servy; 03.04.2013
comment
Нулевой символ является допустимым символом. Имеет определенную ценность. Он имеет особое значение для многих языков программирования, но по-прежнему является символом. Никакой символ не может существовать так же, как не может существовать int, хотя мы часто говорим об отсутствии денег, имея в виду ноль :) - person nvoigt; 03.04.2013
comment
@nvoigt Никакой символ (или int) определенно не может существовать. Вам просто нужно изменить тип с char на char?. - person svick; 03.04.2013
comment
@svick Даже символ, допускающий значение NULL, всегда имеет значение. У него есть только additional bool-значение, говорящее вам, полезно ли вам значение char или просто случайный мусор. Но есть ли у него значение, даже символ? не может иметь ценности. Вы можете проверить это, проверить значение символа в обнуляемом char, если HasValue bool имеет значение false. Это все еще символ со значением. - person nvoigt; 04.04.2013
comment
@nvoigt Ну, это зависит от того, что именно означает «имеет значение». Если вы посмотрите на это технически, то да, это struct, у которого есть поля, установленные на false (так что у него есть значение). Но логически это значение представляет состояние без значения, как и реальный null для ссылочных типов. И большую часть времени вы заботитесь о логическом значении кода, а не о его реализации. - person svick; 04.04.2013
comment
@nvoigt, что, если я хочу выполнить замену с помощью: Replace ('*', ''), чтобы заменить звездочку без пробела. Как я могу это сделать? - person Kala J; 05.01.2015
comment
@KalaJ Кажется, это другой вопрос. Вы можете найти здесь свой вопрос и, если вы не нашли ответа, разместите новый вопрос. - person nvoigt; 06.01.2015

  1. '' бессмысленно. Нет понятия «без персонажа» - есть нулевой символ, но это не то же самое, что «без персонажа». Сравните это со строками, которые могут быть нулевой ссылкой (на строку) или строкой нулевой длины.

  2. Уже ответил в комментарии к вашему вопросу @George Duckett: просто удалите yield из случая ' '.

person Matthew Watson    schedule 03.04.2013