web-dev-qa-db-ja.com

Split()を使用しながらTrim()を実行します

今日、次のコードサンプルを実行するより良いソリューションがあるかどうか疑問に思っていました。

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach(string s in split)
{
  if(s.Trim() == match){// asjdklasd; break;}
}

各アイテムを手動で繰り返すことなくtrim()を実行する方法はありますか? 「次の文字で分割し、各結果を自動的にトリミングする」ようなものを探しています。

ああ、投稿する直前に見つけた

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

in 文字列をすべて1行の部分に分割してトリムするにはどうすればよいですか?

それでも私は興味があります:これに対するより良い解決策があるかもしれませんか? (または、コンパイラはおそらくそれらをLinq-Operationと同じコード出力に変換しますか?)

50
citronas

別の可能性のあるオプション(LINQを回避する、良くも悪くも):

string line = " abc, foo  ,     bar";
string[] parts= Array.ConvertAll(line.Split(','), p => p.Trim());

ただし、それがあるかどうかを知る必要がある場合-おそらく短絡ですか?

bool contains = line.Split(',').Any(p => p.Trim() == match);
80
Marc Gravell

コンマで区切られた文字列内の単語をスペースで囲むだけの場合、これは機能します。

var keyword = " abc, foo  ,     bar";
var array = keyword.Replace(" ", "").Split(',');
if (array.Contains("foo"))
{
    Debug.Print("Match");
}
4
Jens Granlund

元の文字列で正規表現を使用し、「任意の数のスペースの後に区切り文字の後に1つ以上のスペースが続く」パターンを探し、それらのスペースを削除することをお勧めします。次に分割します。

3
MikeW

これを試して:

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split = Regex.Split(keyword.Trim(), @"\s*[,;]\s*");
if (split.Contains(match))
{
    // do stuff
}
3
Rubens Farias
var parts = line.Split(';').Select(p => p.Trim()).Where(p => !string.IsNullOrWhiteSpace(p)).ToArray();
2

これを行うにはさまざまな方法がありますが、パフォーマンスの変化と精度はすぐにはわかりません。 NUnitなどのテストスイートにプラグインをすべて接続して、どちらが上位にあるか、またどちらが正確かを確認することをお勧めします。

ループで小、中、および大量のテキストを使用して、さまざまな状況を調べます。

1
McAden