Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VisualStudio中没有错误,代码执行时出现错误(已更新!String.Insert中出现问题)_C#_String_Stringbuilder - Fatal编程技术网

C# VisualStudio中没有错误,代码执行时出现错误(已更新!String.Insert中出现问题)

C# VisualStudio中没有错误,代码执行时出现错误(已更新!String.Insert中出现问题),c#,string,stringbuilder,C#,String,Stringbuilder,我正在为学校作业写一个程序,应该会产生一个10000部电影的列表。一部电影由一个字符串组成,格式为moviename year director。我之所以说电影,是因为电影名称和导演应该是由a-z字母随机生成的 我编写了以下逻辑来生成一部这样的电影。电影名称和导演是长度在4-10个字符之间的随机字母组合。代码在VisualStudio中没有错误,执行时显示为空。若我写得正确,那个么这段代码应该生成一个这样的字符串并将其打印出来,而控制台是空的 Do while循环用于检查列表中是否有一个双项(无

我正在为学校作业写一个程序,应该会产生一个10000部电影的列表。一部电影由一个字符串组成,格式为moviename year director。我之所以说电影,是因为电影名称和导演应该是由a-z字母随机生成的

我编写了以下逻辑来生成一部这样的电影。电影名称和导演是长度在4-10个字符之间的随机字母组合。代码在VisualStudio中没有错误,执行时显示为空。若我写得正确,那个么这段代码应该生成一个这样的字符串并将其打印出来,而控制台是空的

Do while循环用于检查列表中是否有一个双项(无论多么不可能),这是在我执行10000版本时使用的

简言之,我不明白我做错了什么

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的每一行上设置一个断点。。然后观察电影变量是如何变化的,对吗?当您在调试器中逐步执行代码时,哪里出了问题?提示:创建可变对象,更适合这种用途。请提供链接和最佳指南,谢谢!我会检查是否理解并使其工作。请在修改示例时用正确的方法进行指导。非常感谢!我将尝试此操作。插入不会覆盖,它会根据需要将其他字符向右移动时插入一个字符。它确实返回一个新的字符串实例,而不是改变不可变的字符串实例。