2016-05-24 22 views
2

の配列から文字を置き換えるためにLINQラムダを使用する:私は許可されていない文字を含む文字列配列持つ文字列

:私はこのようなforeachので次々と文字を削除することができ

public static string[] IllegalCharacters = { "\"", "/", "\\", "[", "]", ":", "|", "<", ">", "+", "=", ";", ",", "?", "*", "\'", "@", ".", ":", "^", "¨", "å", "ä", "ö", "Å", "Ä", "Ö" }; 

private string RemoveIllegalCharactersFromString(string text) 
{ 
    foreach (string illegalCharacter in IllegalCharacters.IllegalCharacters) 
    { 
     text = text.Replace(illegalCharacter, ""); 
    } 
    return text; 
} 

私の質問は、代わりにlinqラムダ式を使用してメソッドを削除できますか?私が今使っている何

は:

public static HashSet<char> IllegalCharacters = new HashSet<char>(new char[] { '\"', '/', '\\', '[', ']', ':', '|', '<', '>', '+', '=', ';', ',', '?', '*', '\'', '@', '.', ':', '^', '¨','\'' }); 

var t = sourceText.Where(c => !IllegalCharacters.Contains(c)).ToArray(); 
var result = new string(t); 
return result; 
+2

、次のようなループの中で 'StringBuilder.Replace'を使用して簡単にそれを改善することができ[ここ](http://stackoverflow.com/a/25154888/284240)。 –

+0

StringBuilderを使用するのがなぜ「高速」であるかについての情報を提供してもらえますか? –

+1

「より速い」とは言わずより効率的です。それは、より少ないメモリを使用するか、ガベージコレクタが蹴られるのを防ぐかもしれません。だから、 'StringBuilder.Replace' [効率的にすることができます](http://stackoverflow.com/a/6524918/284240).Btw、部分文字列を削除するcharsの代わりにLINQのアプローチはもう働きません。 –

答えて

4

私はcharコレクション(不正な文字が文字する必要があり、右?)、例えばへIllegalCharactersを変更示唆

public static HashSet<char> IllegalCharacters = new HashSet<char>(
    new char[] { '"', '\\', ..., 'Ä', 'Ö' }); 

だから、あなたは明らかにLINQを置くことができます:あなたのアプローチは、より効率的でない場合は、テストする必要があり

string source = "123:+-456"; 

    string result = String.Concat(source 
    .Where(c => !IllegalCharacters.Contains(c))); 
+0

私はO(1)アクセスを提供する 'HashSet'(+1)が好きです。 –

+0

"ÅÄÖ"が文字と見なされるかどうかによって異なります。私はこれをテストする必要があります!ありがとう! –

+0

Concatに問題があったので、これを置き換えました:var t = source.Where(c =>!IllegalCharacters.Contains(c))。ToArray(); var result =新しい文字列(t);戻り値: ; –

2

あなたはAggregateを使用することができます。

private string RemoveIllegalCharactersFromString(string text) 
{ 
    return IllegalCharacters.Aggregate(text, (current, illegalCharacter) => current.Replace(illegalCharacter, "")); 
} 

結果:このよう

ここ
string result = RemoveIllegalCharactersFromString("HelloÄ[2536]:Y?eÖs*"); 
//Result => Hello2536Yes 
3

LINQの

string Text = "1:2+3[4]5|6"; 
string Result = new string(Text.Where(x => !IllegalCharacters.Contains(x.ToString())).ToArray()); 

とのアプローチは、私が代わりにstringのタイプcharで文字を格納し、HashSetの代わりを使用していますstring[]

HashSet<char> IllegalCharacters = new HashSet<char>() { '\'', '/', '\\', '[', ']', ':', '|', '<', '>', '+', '=', ';', ',', '?', '*', '\'', '@', '.', ':', '^', '¨', 'å', 'ä', 'ö', 'Å', 'Ä', 'Ö' }; 

string Text = "1:2+3[4]5|6"; 
string Result = new string(Text.Where(x => !IllegalCharacters.Contains(x)).ToArray()); 
関連する問題