Distinct()看不到ToLower()方法更改的大写字母

时间:2019-11-10 23:01:41

标签: c# distinct tolower

这是我的代码:

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文件中的第一个单词是“ With”。第一个循环仅显示

  

我是h

但是当第二个循环开始时,它会询问

  

与w交换

我不知道为什么。 同样,第一个循环中的if语句不起作用,它不会检测到空格。

2 个答案:

答案 0 :(得分:2)

我稍微修改了您的代码,除了“ fixing” if语句外(由于您的数组包含char,但从未与字符串进行比较,因此从未如此,但与字符串进行了比较(“”为字符串,“”为char ))包含一个新的循环,该循环突出显示并修复了原来是主要问题的内容(回车和换行符, Wim十Brink 在评论中指出)。我使用的字符串值仅用于演示问题。

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 :(得分:1)

我还修改了您的代码:

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] + " "); }
}

一些小事。我合并了前两行,将“”更改为“”,因此它现在比较字符,将字符计数更改为使用distinctLetter,而不是再次执行相同的Distinct()命令,并且我添加了两个条件处理回车和换行。 (顺便说一句,我总是把它们混在一起。)
这现在显示正确的结果,但也应解释字符丢失的原因!实际上,这是一个简单的原因。 您的文本文件中有一个回车符,它将把光标发送回左侧。这将导致第一个字符被空格覆盖...

因此,您的代码实际上显示“ w i ...”,但随后得到“ \ r”。然后它将打印一个空格,返回到行的开头,并在''上写另一个空格。然后换行符将在下一行,在'w'上打印第二个空格,移至下一行并再次打印一个空格。然后剩下的打印出来...

很简单,不是吗?但是通过用两个额外的if语句捕获这两个特殊字符,它是固定的... :-)在控制台应用程序中,'\ r'和'\ n'字符经常被忽略,当它们被打印时会产生意想不到的结果。 / p>