首页 > 解决方案 > Visual Studio 中没有错误,代码执行但 C# 不正确(更新!S​​tring.Insert 中的问题)

问题描述

我正在编写一个作业程序,它应该生成一个 10 000 个“电影”列表。单个“电影”由“电影名称年份导演”形式的字符串组成。我说“电影”是因为电影名称和导演应该是用 az 的字母随机生成的。

我编写了以下逻辑来生成这样一部“电影”。电影名称和导演是长度在 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;
    }

   }
 }

标签: c#stringstringbuilder

解决方案


字符串是不可变的,因此调用Insert()电影字符串上的方法不会对当前电影变量做任何事情。相反,它返回新字符串。

但是,您最好将电影类型从 更改stringStringBuilder,这是一个动态分配的字符缓冲区,因此您的示例变为:

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;
        }

    }
}

推荐阅读