这是我的代码:
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
语句不起作用,它不会检测到空格。
答案 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>