Unerklärliches Verhalten von Array.Except (Linq)

14/05/2010 - 14:12 von Tom Becker | Report spam
Hallo

Ich verwende eine Funktion, die einen String von speziellen Zeichen
bereinigen soll.
Dafür scheint mir Array.Except() aus Linq ein brauchbarer Ansatz:

static string replacementChars = "\b -_\\,;/.";

public static string Clean(string val)
{
char[] valArray = val.ToCharArray();
IEnumerable<char> result valArray.Except(replacementChars.ToCharArray());

return new string(result.ToArray());
}

Leider liefert die Funktion nicht nachvollziebare Ergebnisse:
Clean("bla") --> bla OK
Clean("b la;") --> bla OK
Clean("65205") --> 6520 Warum??


Kennt jemand die Ursache?

thx
Tom
 

Lesen sie die antworten

#1 Günter Prossliner
14/05/2010 - 14:28 | Warnen spam
Hallo Tom!

Ich verwende eine Funktion, die einen String von speziellen Zeichen
bereinigen soll.
Dafür scheint mir Array.Except() aus Linq ein brauchbarer Ansatz:

Leider liefert die Funktion nicht nachvollziebare Ergebnisse:
Clean("bla") --> bla OK
Clean("b la;") --> bla OK
Clean("65205") --> 6520 Warum??



Offensichtlich, weil '5' bereits zurückgegeben wurde, und .Except keine
Duplikate zurückgibt.

Die Doku diesbezüglich [Enumerable.Except(TSource) Method
(IEnumerable(TSource), IEnumerable(TSource)) (System.Linq)]
http://msdn.microsoft.com/en-us/lib...00779.aspx ist IMO nicht
eindeutig:

"The set difference of two sets is defined as the members of the first set
that do not appear in the second set.

Note
This method returns those elements in first that do not appear in second. It
does not also return those elements in second that do not appear in first."


Also würde ich eine "gute alte Schleife" nehmen - ist von der Performance
auch unschlagbar, wobei das als "Microoptimierung" zumeist unerheblich ist:

static string Clean(string input) {

var sb = new StringBuilder(input.Length);
foreach(char inputChar in input){
switch(inputChar){
case '\b':
case ' ':
case '-':
case '_':
case '\\':
case ',':
case ';':
case '/':
case '.':
continue;
default:
sb.Append(inputChar);
}
}

return sb.ToString();
}


mfg GP

Ähnliche fragen