0

リスト要素を大文字に変更したいのですが、このコードはエラーになります。

List<string> fruit = new List<string>();
fruit.Add("apple");
fruit.Add("cherry");
fruit.Add("orange");

fruit.ForEach(
    delegate(string s)
        {
            s = s.ToUpper();
        }
    );
fruit.ForEach(

    delegate(string s)
    {
        Console.WriteLine(s);
    }
   );
4

6 に答える 6

1

文字列は不変です -ToUpper文字列を変更しません - 新しいものが作成されます。元のフルーツ リストはまだ古い文字列を参照しています - あなたのForEach/ToUpper()コードは効果がありません。

古いものを削除して果物から新しい文字列を追加するか、IMO でリスト全体を新しいリストに再投影する必要があります。その後、新しい果物リストを割り当てることができます。

すなわち

fruit = fruit.Select(s => s.ToUpper()).ToList();
fruit.ForEach(s => Console.WriteLine(s));
于 2013-08-30T14:49:16.987 に答える
0

string不変です。forループでそれを行う必要があります:

List<string> fruit = new List<string>();

fruit.Add("apple");
fruit.Add("cherry");
fruit.Add("orange");

for(int i = 0; i < fruit.Count; i++)
{
    fruit[i] = fruit[i].ToLower();
}

または、正しいアイテムで新しいものを作成し、参照List<string>を置き換えることができますfruit:

fruit = fruit.Select(x => x.ToLower()).ToList();
于 2013-08-30T14:48:43.810 に答える
0

forループでこれを試してください

List<string> fruit = new List<string>();
            fruit.Add("apple");
            fruit.Add("cherry");
            fruit.Add("orange");

            for( int i = 0; i < fruit.Count; i++ ) {

                Console.WriteLine(fruit[i].ToUpper()); // To Check
            }
于 2013-08-30T14:49:08.550 に答える
0

s.ToUpper()まず、そのままでは は実際には変化しないことに注意することから始めましょうs。他の多くの回答が言及しているように、C#の文字列は不変であるため、これは不可能です。あなたがしたので、あなたはこれを認識していると思いますs = s.ToUpper()

AListには項目への参照が含まれています。

ForEachこれらの参照のコピーを提供します (sこの場合は に保存されます)。

を再割り当てsすると、元の参照は変更されず、コピーのみが変更されますs

元の参照と同じオブジェクトを参照するため、(つまりを再割り当てするのではなく)変更s(つまり) した場合、実際にはリストが変更されます。s.someModifyingFunction()s = ...s

MarcinJuraszek が述べたように、単純な通常の for ループを使用すると動作するはずです。

for(int i = 0; i < fruit.Count; i++)
    fruit[i] = fruit[i].ToUpper();

それをイメージするには、次のように考えてください。

オブジェクトは本です。

リストには、それぞれが本を指している生徒がたくさん含まれています。

するとForEach、リスト内の生徒の 1 人と同じ本を指し示す新しい生徒が得られます。

を再割り当てするときs、新しい生徒に別の本を指すように依頼します。リスト内の学生は、以前と同じ本をまだ指しています。

を変更するときはs、その本に書き込みます (同じ本なので、リスト内の学生は、これらの変更が加えられた本を指し示します)。

于 2013-08-30T14:58:14.887 に答える
0
fruit = fruit.Select(x => x.ToUpper()).ToList();

要素を新しいリストに射影する方がよいでしょう。デリゲートを使用してコードを醜くする理由もありません。ラムダ構文を使用するだけです:

fruit.ForEach(s => Console.WriteLine(s));

または代わりに

foreach(var s in fruit)
    Console.WriteLine(s);
于 2013-08-30T14:52:28.057 に答える