C# 从字符串中删除间距 我在两个文件中阅读并比较它们,其中我意识到的一件事就是删除间隔,因为它造成了一个差异,我不希望间距是差异的一个方面,所以我想删除它。p>

C# 从字符串中删除间距 我在两个文件中阅读并比较它们,其中我意识到的一件事就是删除间隔,因为它造成了一个差异,我不希望间距是差异的一个方面,所以我想删除它。p>,c#,winforms,linq,C#,Winforms,Linq,这就是我到目前为止所做的: Dictionary<string, int> Comparer = new Dictionary<string, int>(); string line; using (StreamReader sr = new StreamReader(openFileDialog1.FileName)) { while (sr.Peek() >=

这就是我到目前为止所做的:

Dictionary<string, int> Comparer = new Dictionary<string, int>();
            string line;
            using (StreamReader sr = new StreamReader(openFileDialog1.FileName))
            {
                while (sr.Peek() >= 0 )
                {
                    line = sr.ReadLine();

                    if (Comparer.ContainsKey(line))
                        Comparer[line]++;
                    else
                        Comparer[line] = 1;
                }
            }

using (StreamReader sr = new StreamReader(openFileDialog2.FileName))
            {
                while (sr.Peek() >= 0)
                {
                    line = sr.ReadLine();
                    if (Comparer.ContainsKey(line))
                        Comparer[line]--;
                    else
                        Comparer[line] = -1;
                }
            }

            int mismatches = 0;

            var firstFileChanges = new List<string>();
            var secondFileChanges = new List<string>();

            System.Text.StringBuilder theStringBuilder = new System.Text.StringBuilder();
            foreach (KeyValuePair<string, int> kvp in Comparer)
            {
                if (kvp.Value != 0)
                {
                    mismatches++;
                    string InWhich = kvp.Value > 0 ? openFileDialog1.FileName : openFileDialog2.FileName;

                    if (InWhich == openFileDialog1.FileName)
                    {
                        firstFileChanges.Add(kvp.Key);
                    }
                    else
                    {
                        secondFileChanges.Add(kvp.Key);
                    }
               }
            }
            if (firstFileChanges.Count > 0)
            {
                theStringBuilder.Append("ADDED IN " + openFileDialog1.SafeFileName+": \n");

                int counter1 = 0;
                foreach (string row in firstFileChanges)
                {
                    if (counter1 > 0)
                    {
                        theStringBuilder.Append("\n ");
                    }
                    theStringBuilder.Append(row);
                    counter1 += 1;
                }
               theStringBuilder.AppendLine();
            }

            if (secondFileChanges.Count > 0)
            {
                theStringBuilder.Append("\nDELETED FROM "+openFileDialog2.SafeFileName+": \n");

                int counter2 = 0;
                foreach (string row in secondFileChanges)
                {
                    if (counter2 > 0)
                    {
                        theStringBuilder.Append("\n ");
                    }

                    theStringBuilder.Append(row);

                    counter2 += 1;
                }
            }
输入文件示例: 名称SPAAAAACE标题spaaaaaaace状态

我希望是:
Name Title Status

好吧,如果你有一个字符串x,你可以这样做

x.Trim();

while(x.Contains("  "))
{
   x.Replace("  ", " ");
}
x.Replace(" ", "");
x.Replace("\t", "");
这样,单词或句子之间的最大空格就是一个空格

如果您想删除所有空白,您可以这样做

x.Trim();

while(x.Contains("  "))
{
   x.Replace("  ", " ");
}
x.Replace(" ", "");
x.Replace("\t", "");

这将删除字符串中的所有空格

下面将删除字符串中的所有空格、换行符等

string NoWhiteSpaceString = new String(yourString
                                     .Where(r=> !char.IsWhiteSpace(r))
                                     .ToArray());
编辑:要删除多个空间并将其替换为单个空间,您可以尝试:

string yourString = "Name           Title           Status";
string NoWhiteSpaceString =
    string.Join(" ", 
            yourString.Split(new[]{' '}, StringSplitOptions.RemoveEmptyEntries));
结果将是:

NoWhiteSpaceString = "Name Title Status"

只需将多个空格替换为一个空格:

string cleanedLine = System.Text.RegularExpressions.Regex.Replace(line,@"\s+"," ");
if (Comparer.ContainsKey( cleanedLine ))
    Comparer[ cleanedLine ] ++;
else
    Comparer[ cleanedLine ] = 1;

这将用一个空格替换所有多个空格

string input = "Name      Title        Status";
string result = string.Join(" ", input.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries)); //result is "Name Title Status"

你的问题到底是什么?你想忽略的间距是多少?只是空行?还是行首的空行和空格?或任何地方的空格?您可以使用以下代码删除字符“”:String.Replace@MatthewWatson我用一个输入示例更新了我的帖子,以及我希望它看起来像什么;不会删除所有空白。请记住有\t、\r、\n个字符。可能是您的\t正确,但是\r和\n@鲁克看看他的例子和问题,新台词上什么也没说。编辑了答案accordingly@TimSchmelter:经常?在什么意义上?它为每个调用创建一个数组,并在此之前创建一个列表-至少在LINQ部分。另一个副本出现在string.ctor中。@rook:我删除了我的评论,因为它几乎是微优化。然而,既然你已经评论了我自己的答案,这里又是我的答案。这将创建一个新的可能很长的字符串,创建一个新的lamdba字符串中的每个字符,枚举所有字符,从未知大小创建一个新的char[],这样就可以了。每一行都是这样。最后,它删除了所有的空格,即使OP想要名称标题状态作为结果。@TimSchmelter,也只是根据OP的例子更新了答案。我仍然不确定优化的方法。@TimSchmelter:我完全同意这个观点:在字符串中的每个字符都创建一个新的lamdba。它当然会为每个字符调用lambda,如果这是您的意思的话。它不是一个表达式,需要.Compile和cache方法。另外,我也不确定OP到底想要什么,因为这个解决方案的初始版本为他产生了预期的输出。@rook:你们可能对lambda说得对,J.Skeet在哪里?。然而,正如我所记得的,两者之间有一个区别:1。其中r=>char.IsWhiteSpacer和2。其中char.IsWhiteSpace,后者更有效。根据OP的要求,谁知道呢,但他提到我希望它是:名称标题状态包含单个空格。这是一个很好的解决方案,+1。但是你删除评论的速度太快,因此应该得到-1;这是有效的,但由于某种原因,我没有得到我所期望的结果。我正在研究它,但是下面的解决方案返回了我想要的结果。