14

我正在编写一个程序,它应该在 foreach 循环中显示数组中的项目。

我想通过向每个元素添加一个字符串“sad”来更改数组的元素,但是当运行程序时,数组保持不变。

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] stringArray = {"hey", "Tom"};

            for (int i = 0; i < stringArray.Length; i++ )
            {
                stringArray[i] += "  dad";
                Console.WriteLine(stringArray[i]);
            }

            Array.Resize(ref stringArray, stringArray.Length + 1);

            // Add bob to the last element of the array
            stringArray[stringArray.Length - 1] =" bob";

            foreach (string s in stringArray)
            {
                string b = s + "sad";
                Console.WriteLine(s);
                //Console.WriteLine(stringArray);
            }
        }
    }
}
4

4 回答 4

11
        foreach (string s in stringArray)
        {   
            string b = s + "sad";
            // ...
        }

在这里,您正在创建一个与字符串数组中的字符串完全无关的新字符串。您没有更改旧字符串(您不能;字符串是不可变的)。然后,您只需将这个新的更长的字符串放在地板上 - 您没有更新数组等。

试试类似的东西:

for(int i = 0 ; i < stringArray.Length ; i++)
{
    stringArray[i] = stringArray[i] + "sad";
}

这将用新字符串替换数组中的每个项目。请注意,您无法在迭代时更新列表/集合/数组等foreach- 这可能会破坏迭代器。因此for改为循环。

于 2013-05-12T21:25:13.980 回答
11

除了克里斯所说的,你可以简单地使用 LINQ 来实现你想要的:

string[] newStringArray = stringArray
    .Select(s => s + "sad")
    .ToArray();
于 2013-05-12T21:26:19.957 回答
3
string b = s + "sad";

Console.WriteLine(s);

//Console.WriteLine(stringArray);

在您的代码中,您绝不会更改数组中的值。您从数组中的每个值创建一个新string值,并与 string 连接"sad"

解决方案

您不能更改for-each变量。您会收到如下消息:

无法分配给“s”,因为它是“foreach 迭代变量”。

相反,满足于一个简单的for循环。

for(int x = 0; x < stringArray.length; x++)
{
     stringArray[x] = stringArray[x] + "sad";
}
于 2013-05-12T21:23:11.907 回答
0

看这部分代码:

string b = s + "sad";
Console.WriteLine(s);

您将字符串s与字符串连接起来"sad",并存储在变量中b。然后显示变量的内容s。如果要显示变量bistead 的内容,则sad每个字符串的末尾都会有 a。

于 2013-05-12T21:24:50.897 回答