Взгляните на код:
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. Я также просто вложил это в csharppad (веб-IDE/компилятор) и получил те же результаты.
Почему это происходит?
ИЗМЕНИТЬ: Хорошо, я не знал, что, кроме того, как указал Райан О'Хара, операция была завершена. Раньше я не использовал его.
// 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) ).