4

これがLINQPad関連なのか、それとも何か間違ったことをしているのかはわかりませんが、このコードは私がやりたいことをしません。具体的にはForEach(...)

私の目標は、「」を空の文字列に置き換えることです。これを行うより良い方法はありますか?

var lastNames = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN";

var listLastNames = lastNames.Split(',');
var list = listLastNames.ToList(); //so I can use .ForEach
list.ForEach(i=>i.Replace(" ",String.Empty));

list.Dump(); //show it on output
4

2 に答える 2

13

他の人が指摘したように、文字列はimmutableです。Replace を呼び出すと、単純に新しい文字列が返されます。既存の文字列をその場で変更しません。やりたいことを実現するには、次の 3 つの方法があります。

sequenceで変換を行い、最後にリストに変換します。

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN";  
List<string> lastNames = s.Split(',').Select(x=>x.Trim()).ToList();

または、クエリ構文で同じこと:

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN"; 
var query = from lastName in s.Split(',')
            select lastName.Trim();
List<string> lastNames = query.ToList();

または、配列を作成し、配列をその場で変更します。

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN";  
string[] lastNames = s.Split(',');
for (int i = 0; i < lastNames.Length; ++i)
    lastNames[i] = lastNames[i].Trim();
于 2012-04-24T21:44:54.453 に答える
10

Replace新しい値を返しますが、それを呼び出した元の文字列には影響しません。必要なことを行うには、次の結果を使用して新しいコレクションを作成する必要がありますReplace。これは次の方法で簡単に実行できますSelect

var replaced = list.Select(i=>i.Replace(" ",String.Empty));

もう 1 つの利点は、これを行うために a にキャストする必要がないことですList<T>

そして、他の人が指摘したようにTrim()、よりクリーンなソリューションとして使用できますReplace()

var collection = lastNames.Split(',').Select(i => i.Trim());
于 2012-04-24T21:35:46.250 に答える