Distinct () не видит заглавную букву, измененную методом ToLower () - PullRequest
0 голосов
/ 11 ноября 2019

Это мой код:

string textToEncode = File.ReadAllText(@"C:\Users\ASUS\Desktop\szyfrowanie2\TextSample.txt");
textToEncode = textToEncode.ToLower();
char[] distinctLetters = textToEncode.Distinct().ToArray();
var count = textToEncode.Distinct().Count();
Console.WriteLine("Letters used in text: \n\n");
for (int i = 0; i < count; i++)
{
    if (Equals(distinctLetters[i]," "))
    {
        Console.Write("<space>"); 
    }
    else
    {
        Console.Write(" " + distinctLetters[i] + " ");
    }
}

Я хочу прочитать файл .txt, превратить его в строчные буквы методом ToLower();, но затем, когда я захочу прочитать все различные символы из. TXT-файл, а затем напишите их на экране, они не отображаются. Еще позже, когда я использую

for (int i = 0; i < distinctLetters.Length; i++)
{
    Console.Write("Swap " + distinctLetters[i] + " with "); 

, он показывает букву, которая действительно была изменена в нижний регистр, но не была видна на экране первым циклом for. Первое слово в моем файле TextSample.txt - «С». Первый цикл показывает только

ith

Но при запуске второго цикла он запрашивает

Swap w с

и я понятия не имею, почему. Также оператор if в первом цикле не работает, он не обнаруживает пробел.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Я немного изменил ваш код, кроме «исправления» оператора if (поскольку это никогда не было правдой из-за того, что ваш массив содержит символы, но сравнивался со строкой («» - это строка, «» - это символ)) включил новый цикл, который выделяет и исправляет то, что оказалось главной проблемой (возврат каретки и символы новой строки, на что любезно указал Вим тен Бринк в комментариях). Я использовал строковое значение только для демонстрации проблемы.

string textToEncode = "abc\rdefabdg";

textToEncode = textToEncode.ToLower();

char[] distinctLetters = textToEncode.Distinct().ToArray();
var count = distinctLetters.Length;

Console.WriteLine("Letters used in text (old):");

for (int i = 0; i < count; i++)
{
    var letter = distinctLetters[i];
    if (Equals(letter, " "))
    {
         Console.Write("<space>");
    }
    else
    {
         Console.Write(distinctLetters[i]);
    }
}

Console.WriteLine();
Console.WriteLine("Letters used in text (new):");

for (int i = 0; i < count; i++)
{
   var letter = distinctLetters[i];

   if (!char.IsLetter(letter))
       continue;

   Console.Write(distinctLetters[i]);
}

И вывод:

Буквы, используемые в тексте (старые):

defg

Буквы, используемые в тексте (новое):

abcdefg

1 голос
/ 11 ноября 2019

Я также немного изменил ваш код:

string textToEncode = File.ReadAllText(@"C:\Users\ASUS\Desktop\szyfrowanie2\TextSample.txt").ToLower();
char[] distinctLetters = textToEncode.Distinct().ToArray();
var count = distinctLetters.Count();
Console.WriteLine("Letters used in text: \n\n");
for (int i = 0; i < count; i++)
{
    if (Equals(distinctLetters[i], ' ')) { Console.Write("<space>"); }
    else if (Equals(distinctLetters[i], '\r')) { Console.Write("<cr>"); }
    else if (Equals(distinctLetters[i], '\n')) { Console.Write("<lf>"); }
    else { Console.Write(" " + distinctLetters[i] + " "); }
}

Несколько мелких вещей. Я слил две первые строки, изменил "" в ", чтобы теперь сравнивать символы, изменил подсчет символов, чтобы использовать отдельные элементы вместо выполнения одной и той же команды Distinct (), и я добавил два условия для обработкивозврат каретки и перевод строки. (Я всегда смешиваю их, кстати.)
Теперь это показывает правильный результат, но также должно объяснить, почему пропали символы! Простая причина, на самом деле. В вашем текстовом файле есть символ возврата каретки, который вернет курсор назад влево. Это приведет к тому, что первый символ будет заменен пробелом ...

Таким образом, ваш код на самом делепечатает "wi ...", но затем получает '\ r'. Затем он напечатает пробел, вернется к началу строки и запишет еще один пробел через ''! Затем будет следующий символ новой строки, который напечатает второй пробел над буквой «w», переместится на следующую строку и снова напечатает пробел. Тогда остальное печатается ...

Просто, не правда ли? Но путем захвата этих двух специальных символов с помощью двух дополнительных операторов if это исправляется ... :-) Символы '\ r' и '\ n' часто пропускаются в консольных приложениях, давая неожиданные результаты при печати. ​​

...