为什么查询结果中缺少一个字符

本文关键字:一个 字符 查询 结果 为什么 | 更新日期: 2023-09-27 18:27:35

看看代码:

string expression = "x & ~y -> (s + t) & z";
var exprCharsNoWhitespace = expression.Except( new[]{' ', ''t'} ).ToList();
var exprCharsNoWhitespace_2 = expression.Replace( " ", "" ).Replace( "'t", "" ).ToList();
// output for examination
Console.WriteLine( exprCharsNoWhitespace.Aggregate( "", (a,x) => a+x ) );
Console.WriteLine( exprCharsNoWhitespace_2.Aggregate( "", (a,x) => a+x ) );
// Output:
// x&~y->(s+t)z
// x&~y->(s+t)&z

我想从原始字符串中删除所有空白,然后获得单个字符。结果使我大吃一惊。正如预期的那样,变量exprCharsNoWhitespace不包含空格,但出乎意料的是,它只包含几乎所有其他字符。"&"的最后一次出现缺少,则列表的计数为12。尽管exprCharsNoWhitespace_2完全符合预期:Count为13,但除空白字符外的所有字符都包含在内。

所使用的框架是.NET 4.0。我也只是把它粘贴到csharpad(基于web的IDE/编译器)上,得到了相同的结果。

为什么会发生这种情况?


编辑:好吧,我不知道,正如Ryan O'Hara所指出的,Except是一个固定的操作。我以前没用过。

// So I'll continue just using something like this:
expression.Where( c => c!=' ' && c!=''t' )
// or for more characters this can be shorter: 
expression.Where( c => ! new[]{'a', 'b', 'c', 'd'}.Contains(c) ).

为什么查询结果中缺少一个字符

Except产生集合差异。您的表达式不是一个集合,因此它不是正确的使用方法。至于&具体缺失的原因:是因为它被重复了。其他字符都不是.

Ryan已经按要求回答了您的问题,但我想为您提供一个解决您所面临问题的替代方案。如果您需要进行大量的字符串操作,您可能会发现正则表达式模式匹配很有帮助。你给出的例子是这样的:

string expression = "x & ~y -> (s + t) & z";
string pattern = @"'s";
string replacement = "";
string noWhitespace = new Regex(pattern).Replace(expression, replacement);

或者对于第二个例子,除了以下模式之外,保持所有内容不变:

string pattern = "[abcd]";

如果要经常使用相同的模式,请将Regex对象存储在某个位置,而不是每次都创建它。

如前所述,.Except(...)是一个集操作,因此它会删除重复项。

试着只使用.Where(...)

string expression = "x & ~y -> (s + t) & z";
var exprCharsNoWhitespace =
    String.Join(
        "",
        expression.Where(c => !new[] { ' ', ''t' }.Contains(c)));

这给出:

x&~y->(s+t)&z