Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字符串中删除非法字符_C#_Desktop Application - Fatal编程技术网

C# 如何从字符串中删除非法字符

C# 如何从字符串中删除非法字符,c#,desktop-application,C#,Desktop Application,我将使用 StreamReader sr = new StreamReader(FileName); string str = sr.ReadToEnd(); 在这里,我得到了一些非法字符,如/n、/r和其他一些字符 我想用空字符替换非法字符。我尝试创建字符数组,但无法删除这些数组,因此任何人都可以帮助我您可以使用字符串。替换方法: string str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");

我将使用

   StreamReader sr = new StreamReader(FileName);

            string str = sr.ReadToEnd();
在这里,我得到了一些非法字符,如/n、/r和其他一些字符


我想用空字符替换非法字符。我尝试创建字符数组,但无法删除这些数组,因此任何人都可以帮助我

您可以使用
字符串。替换方法:

string str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
但是,如果字符串很长并且有一长串非法字符,这不是一个好主意,因为每次调用
Replace
都会创建
string
的新实例。更好的选择是使用Linq过滤掉非法字符:

char[] illegalChars = new[] { '\r', '\n' }; // add other illegal chars if needed
char[] chars = sr.ReadToEnd().Where(c => !illegalChars.Contains(c)).ToArray();
string str = new String(chars);
但是对
的调用包含
会增加开销,直接针对每个非法字符进行测试会更快:

char[] chars = sr.ReadToEnd().Where(c => c != '\r' && c != '\n').ToArray();
string str = new String(chars);
为了完整起见,这里有一个更快的版本:

StringBuilder sb = new StringBuilder();
foreach(char c in sr.ReadToEnd())
{
    if (c != '\r' && c != '\n')
        sb.Append(c);
}
string str = sb.ToString();

您应该使用
String.Empty
而不是
是的,同意,这样看起来会更干净。替换的问题是StringBuilder会不断地移动其缓冲区中的字符。预筛选字符并将其逐个添加到StringBuilder中的速度要快得多假设您知道/r/n指的是换行符?这看起来很有创意,但临清的性能仍然会受到影响。sr.readtoend()。如果不存在,我如何调用nathis@Dorababu,只需在文件中添加一个
using System.Linq
子句(但您看不到intellisense中的位置,因为它对字符串是隐藏的)@开发者艺术,Linq不会让它变慢。。。它基本上只是一个带有测试的foreach循环,Linq不会增加那么多开销。然而,调用
Contains
使它有点慢,所以我发布了一个新版本,它实际上比您的更快;)。
StringBuilder.Replace
的问题是,每次删除2.0中使用的字符时,它都必须移动大块数据。还有其他的吗way@Dorababu,是的,请参阅上次编辑。最后一段代码没有使用LINQ这听起来不错。你能解释一下它是如何清除所有这些非法物品的吗characters@Dorababu,所做的只是从文件中剥离新行(\r\n)。我不知道您所说的非法字符是什么意思,因为新行不是非法字符,但我有一个印象,您正在寻找从文件中\r\n剥离,所以我提出了此解决方案。
StreamReader sr = new StreamReader (FileName);

StringBuilder sb = new StringBuilder (sr.ReadToEnd());

sb.Replace ("\r\n", String.Empty);
sb.Replace ("\n", String.Empty);

string hereIsYourString = sb.ToString ();
string str = string.Join(string.Empty, File.ReadAllLines(FileName));