List< string>の文字列をトリムしようとするのはなぜですか。動作していないようですか?
-
03-07-2019 - |
質問
LINQPadで次のコードを試したところ、以下の結果が得られました。
List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s)
{
s.Trim();
});
listFromSplit.Dump();
&quot; a&quot;および&quot; b&quot;
したがって、文字bは、期待どおりに空白が削除されなかった...?
誰でもアイデアがあります
[注:.Dump()メソッドは、LINQPadの拡張機能であり、オブジェクトのコンテンツをインテリジェントにフォーマットされた方法で印刷します]
解決
String.Trim()メソッドは、更新された文字列を表す文字列を返します。文字列オブジェクト自体を更新するのではなく、新しいオブジェクトを作成します。
これを行うことができます:
s = s.Trim();
ただし、コレクションを列挙している間はコレクションを更新できないため、既存のリストを列挙しながら新しいリストを埋めるか、String.Splitによって返される文字列配列を使用してリストを手動で設定します。
新しいリストの入力:
List<string> temp = new List<string>("a, b".Split(",".ToCharArray()));
List<string> listFromSplit = new List<string>();
temp.ForEach(delegate(string s)
{
listFromSplit.Add(s.Trim());
});
listFromSplit.Dump();
手動での入力:
string[] temp = "a, b".Split(",".ToCharArray());
List<string> listFromSplit = new List<string>();
foreach (string s in temp)
{
listFromSplit.Add(s.Trim());
};
listFromSplit.Dump();
他のヒント
単に文字列を作成するだけで、何も割り当てません。
var s = " asd ";
s.Trim();
sは更新されませんが、..
var s = " asd ";
s = s.Trim();
will ..
var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());
どうすればいいのでしょうか。
Adrian Kuhn では次のことができます。
var result = listFromSplit.Select(s => s.Trim());
文字列インスタンスは不変です。変更するように見えるものはすべて、代わりに新しいインスタンスを作成します。
トリミング結果を何にも割り当てていません。これは古典的なエラーです。stringを使用してこの間違いを犯す習慣から抜け出しました。置換:)
私はIDEAを実行していませんが、これで仕事が完了するはずです(間違っていない限り):
var result = from each in listFromSplit select each.Trim();
スペースとカンマの両方で分割し、空のエントリを削除します。すべて素敵でトリミング。ただし、文字列にスペースが含まれていないと仮定します。
List<string> listFromSplit =
new List<string>( "a , b ".Split( new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries ));
他の人が提供したlinqオプションはうまく機能するはずです。別のオプションとして、forループを使用した拡張メソッドがあります:
public static void TrimCollection(this IList<string> stringCollection) {
for (int i = 0; i <= stringCollection.Count() - 1; i++)
stringCollection[i] = stringCollection[i].Trim();
}