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;这是有效的,但由于某种原因,我没有得到我所期望的结果。我正在研究它,但是下面的解决方案返回了我想要的结果。