なぜこの ForEach が機能せず、値の末尾に空白が残るのか疑問に思いました。
string days = "Monday, Tuesday, Wednesday, Thursday, Friday";
string[] m_days = days.Split(',');
m_days.ToList().ForEach(d => { d = d.Trim(); } );
私はこれを行う他の方法があることを知っているので、私はそこに答える必要はありません。
トリミングされた文字列を再割り当てしていないためです。
var list = m_days.Split(',').Select(s => s.Trim()).ToList();
ForEach
が機能しないのはなぜですか、または をForEach
間違って使用しているのですか?
ForEach
はLinqではなく、のメソッドですList<T>
。あなたがやっていることは基本的にこれです:
foreach(string day in m_days)
{
day.Trim(); // you are throwing away the new string returned by String.Trim
}
LINQ を使用する代わりに、代わりにfor
-loop を使用することもできます。
for(int i = 0; i < m_days.Length; i++)
{
m_days[i] = m_days[i].Trim();
}
次のように、ForEach の出力を新しい変数に割り当てる必要があります。
var trimmedResult = m_days.Select(d => d.Trim()).ToList();
string.Trim
新しい文字列インスタンスを返します。したがって、何らかの方法でその新しいインスタンスを使用する必要があります。
コードでそれを行っていません。
また、 ではできませんForEach
。一見すると、次のように動作する可能性があります。
m_days.ToList().ForEach(d => { d = d.Trim(); });
しかし、d
参照渡しではないため、これも役に立ちません。したがって、リストに格納されているインスタンスではなく、デリゲートに渡されたローカル パラメーターのみを変更します。
おそらくこれが必要です:
var result = days.Split(',').Select(x => x.Trim()).ToList();
LINQ を使用しない別の方法は次のようになります。
var split = days.Split(',');
for(int i = 0; i < split.Length; ++i)
split[i] = split[i].Trim();
String.Trim()
元の文字列を変更しないためです。呼び出すForEach(d => d.Trim())
と、リストの各項目に対して新しいトリミングされた文字列がメモリに作成されますが、その文字列はどこにも割り当てられません。それがあなたがしていることです:
foreach(string d in list)
{
d.Trim();
}
必要なのは
m_days = days.Split(',').Select(d => d.Trim()).ToArray();