Visual Studio 中没有错误,代码执行但 C# 不正确(已更新!String.Insert 中的问题)
No errors in Visual Studio, Code Executes but something not right C# (updated! problem in String.Insert)
我正在编写一个作业程序,它应该生成一个 10 000 "movie" 列表。单个 "movie" 由 "moviename year director" 形式的字符串组成。我说 "movie" 因为电影名称和导演应该是用 a-z 中的字母随机生成的。
我编写了以下逻辑来生成一个这样的 "movie"。电影名称和导演是长度在4-10个字符之间的随机字母组合。代码在 visual studio 中没有给出错误,执行,但显示空白。如果我写得正确,那么这段代码应该会生成一个这样的字符串并打印出来,但控制台是空白的。
执行 while 循环以检查列表中是否有双重项目(尽管不太可能)(这是我执行 10 000 版本时的情况)。
简而言之,我不明白我做错了什么?
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()
方法不会对当前电影变量做任何事情。相反,它 returns 新字符串。
然而,您最好将电影类型从 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;
}
}
}
问题是您使用 movie.Insert
不正确。
如果您阅读 String.Insert
的文档,它会说
https://docs.microsoft.com/en-us/dotnet/api/system.string.insert?view=netframework-4.8
Returns a new string in which a specified string is inserted at a
specified index position in this instance
public string Insert (int startIndex, string value);
所以它returns一个新的String,它不修改现有的。所以你需要做。
movie = movie.Insert(0, Convert.ToString(GetYear()));
但是,我还必须说,以这种方式使用 String.Insert 并不是最好的方法。
您应该改为使用 StringBuilder class。当你想修改字符串(不可变对象)时,它非常有效。
您可能需要阅读其中的部分内容以帮助您理解。如果向下滚动,它还会建议 StringBuilder。
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/
Insert()
方法用于从指定索引位置的指定字符串中return一个新字符串。在您的情况下,您没有捕获更新的字符串。
解决此问题的最佳方法是使用 StringBuilder
对象。请注意 StringBuilder
对象比使用不可变字符串更有效率。
我正在编写一个作业程序,它应该生成一个 10 000 "movie" 列表。单个 "movie" 由 "moviename year director" 形式的字符串组成。我说 "movie" 因为电影名称和导演应该是用 a-z 中的字母随机生成的。
我编写了以下逻辑来生成一个这样的 "movie"。电影名称和导演是长度在4-10个字符之间的随机字母组合。代码在 visual studio 中没有给出错误,执行,但显示空白。如果我写得正确,那么这段代码应该会生成一个这样的字符串并打印出来,但控制台是空白的。
执行 while 循环以检查列表中是否有双重项目(尽管不太可能)(这是我执行 10 000 版本时的情况)。
简而言之,我不明白我做错了什么?
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()
方法不会对当前电影变量做任何事情。相反,它 returns 新字符串。
然而,您最好将电影类型从 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;
}
}
}
问题是您使用 movie.Insert
不正确。
如果您阅读 String.Insert
的文档,它会说
https://docs.microsoft.com/en-us/dotnet/api/system.string.insert?view=netframework-4.8
Returns a new string in which a specified string is inserted at a specified index position in this instance
public string Insert (int startIndex, string value);
所以它returns一个新的String,它不修改现有的。所以你需要做。
movie = movie.Insert(0, Convert.ToString(GetYear()));
但是,我还必须说,以这种方式使用 String.Insert 并不是最好的方法。 您应该改为使用 StringBuilder class。当你想修改字符串(不可变对象)时,它非常有效。
您可能需要阅读其中的部分内容以帮助您理解。如果向下滚动,它还会建议 StringBuilder。
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/
Insert()
方法用于从指定索引位置的指定字符串中return一个新字符串。在您的情况下,您没有捕获更新的字符串。
解决此问题的最佳方法是使用 StringBuilder
对象。请注意 StringBuilder
对象比使用不可变字符串更有效率。