C# VisualStudio中没有错误,代码执行时出现错误(已更新!String.Insert中出现问题)
我正在为学校作业写一个程序,应该会产生一个10000部电影的列表。一部电影由一个字符串组成,格式为moviename year director。我之所以说电影,是因为电影名称和导演应该是由a-z字母随机生成的 我编写了以下逻辑来生成一部这样的电影。电影名称和导演是长度在4-10个字符之间的随机字母组合。代码在VisualStudio中没有错误,执行时显示为空。若我写得正确,那个么这段代码应该生成一个这样的字符串并将其打印出来,而控制台是空的 Do while循环用于检查列表中是否有一个双项(无论多么不可能),这是在我执行10000版本时使用的 简言之,我不明白我做错了什么C# VisualStudio中没有错误,代码执行时出现错误(已更新!String.Insert中出现问题),c#,string,stringbuilder,C#,String,Stringbuilder,我正在为学校作业写一个程序,应该会产生一个10000部电影的列表。一部电影由一个字符串组成,格式为moviename year director。我之所以说电影,是因为电影名称和导演应该是由a-z字母随机生成的 我编写了以下逻辑来生成一部这样的电影。电影名称和导演是长度在4-10个字符之间的随机字母组合。代码在VisualStudio中没有错误,执行时显示为空。若我写得正确,那个么这段代码应该生成一个这样的字符串并将其打印出来,而控制台是空的 Do while循环用于检查列表中是否有一个双项(无
using System;
using System.Collections.Generic;
using System.Linq;
namespace Experiment
{
class Program
{
static void Main(string[] args)
{
Movies();
Console.ReadKey();
}
public static void Movies()
{
List<string> movieList = new List<string>();
bool check = false;
do
{
string movie = "";
for (int i = 0; i < GetNum(); i++)
{
movie.Insert(0, Convert.ToString(GetLetter()));
}
movie.Insert(0, " ");
movie.Insert(0, Convert.ToString(GetYear()));
movie.Insert(0, " ");
for (int i = 0; i < GetNum(); i++)
{
movie.Insert(0, Convert.ToString(GetLetter()));
}
if (movieList.Contains(movie))
{
check = false;
}
else
{
movieList.Add(movie);
check = true;
}
} while (check == false);
Console.WriteLine(movieList[0]);
}
public static Random _random = new Random();
public static char GetLetter()
{
int num = _random.Next(0, 26);
char let = (char)('a' + num);
return let;
}
public static int GetNum()
{
int num = _random.Next(4, 11);
return num;
}
public static int GetYear()
{
int num = _random.Next(1920, 2020);
return num;
}
}
}
字符串是不可变的,因此对电影字符串调用Insert方法不会对当前电影变量产生任何影响。相反,它返回新字符串 不过,最好将电影类型从string更改为StringBuilder,后者是一个动态分配的字符缓冲区,因此您的示例变成:
using System;
using System.Text;
using System.Collections.Generic;
namespace sotest
{
class Program
{
static void Main(string[] args)
{
Movies();
Console.ReadKey();
}
public static void Movies()
{
List<string> movieList = new List<string>();
bool check = false;
do
{
StringBuilder movie = new StringBuilder();
for (int i = 0; i < GetNum(); i++)
{
movie.Insert(0, Convert.ToString(GetLetter()));
}
movie.Insert(0, " ");
movie.Insert(0, Convert.ToString(GetYear()));
movie.Insert(0, " ");
for (int i = 0; i < GetNum(); i++)
{
movie.Insert(0, Convert.ToString(GetLetter()));
}
if (movieList.Contains(movie.ToString()))
{
check = false;
}
else
{
movieList.Add(movie.ToString());
check = true;
}
} while (check == false);
Console.WriteLine(movieList[0]);
}
public static Random _random = new Random();
public static char GetLetter()
{
int num = _random.Next(0, 26);
char let = (char)('a' + num);
return let;
}
public static int GetNum()
{
int num = _random.Next(4, 11);
return num;
}
public static int GetYear()
{
int num = _random.Next(1920, 2020);
return num;
}
}
}
问题是您正在使用电影。插入不正确 如果您阅读了字符串的文档,请插入 返回一个新字符串,其中指定的字符串在指定位置插入 在此实例中指定的索引位置 公共字符串插入int startIndex,字符串值 因此它返回一个新字符串,而不修改现有字符串。所以你需要这样做
movie = movie.Insert(0, Convert.ToString(GetYear()));
但是,我还必须说,以这种方式使用String.Insert并不是最好的方法。
您应该转而考虑使用StringBuilder类。当您想要修改作为不可变对象的字符串时,这是非常有效的
您可能需要阅读其中的部分内容以帮助理解。如果向下滚动,则它还建议使用StringBuilder
Insert方法用于从指定索引位置的指定字符串返回新字符串。在您的情况下,您没有捕获更新的字符串
解决此问题的最佳方法是使用StringBuilder对象。请注意,StringBuilder对象比使用不可变字符串更有效。您是否尝试使用调试器逐步检查代码?在有movie.Insert0的每一行上设置一个断点。。然后观察电影变量是如何变化的,对吗?当您在调试器中逐步执行代码时,哪里出了问题?提示:创建可变对象,更适合这种用途。请提供链接和最佳指南,谢谢!我会检查是否理解并使其工作。请在修改示例时用正确的方法进行指导。非常感谢!我将尝试此操作。插入不会覆盖,它会根据需要将其他字符向右移动时插入一个字符。它确实返回一个新的字符串实例,而不是改变不可变的字符串实例。