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

尝试这个

List<string> fruit = new List<string>();
fruit.Add("apple");
fruit.Add("cherry");
fruit.Add("orange");
fruit = fruit.Select(x=> x.ToUpper()).ToList();
fruit.ForEach(delegate(string s)
                    {
                        Console.WriteLine(s);
                    }
              );

注意:正如上面注释中所指出的,代码将创建一个新的 List 并分配给 fruit 变量。如果您不想替换水果变量,请尝试以下操作。

var upperList = fruit.Select(x => x.ToUpper());
fruit.Clear();
fruit.AddRange(upperList);

字符串是不可变的——字符串对象的内容在对象创建后不能更改,尽管语法使它看起来好像你可以这样做。例如,当您编写此代码时,编译器实际上会创建一个新的字符串对象来保存新的字符序列

string b = "h";
b += "ello";

来自Msdn

于 2013-08-30T14:49:56.433 回答
1

字符串是不可变ToUpper的 - 不会更改字符串 - 创建一个新字符串。原始水果列表仍然引用旧字符串 - 您的ForEach/ToUpper()代码无效。

您将需要从水果中删除旧字符串并添加新字符串,或者更好的是 IMO,将整个列表重新投影到新列表中,然后可以分配新的水果列表,

IE

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

首先,让我们首先注意s.ToUpper()原样 并没有真正改变s。这是不可能的,因为 C# 中的字符串是不可变的,正如许多其他答案所提到的那样。我假设您已经意识到这一点,因为您这样做了s = s.ToUpper()

AList包含对项目的引用。

ForEach为您提供这些参考的副本(s在本例中存储)。

重新分配时s,您不会更改原始参考,只会更改副本s

如果您要修改s(ie s.someModifyingFunction())(而不是重新分配它, ie s = ...),因为s引用与原始引用相同的对象,这实际上会更改列表。

使用 MarcinJuraszek 提到的简单常规 for 循环应该可以工作:

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

想象一下,这样想:

对象是书。

该列表包含一群学生,每个学生都指向一本书。

当你这样做时ForEach,你会得到一个新学生,它与列表中的一个学生指向同一本书。

当你重新分配时s,你让新学生指向另一本书。列表中的学生仍然指向与以前相同的书。

当你修改时s,你在书中写(因为是同一本书,列表中的学生仍然会指向有这些变化的书)。

于 2013-08-30T14:58:14.887 回答
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
fruit = fruit.Select(x => x.ToUpper()).ToList();

您最好将元素投影到新列表中。也没有理由使用委托使代码变得丑陋。只需使用 lambda 语法:

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

或者

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