C#从多种方法访问列表

时间:2015-09-03 05:24:56

标签: c# list methods

我希望从同一个类中的不同方法访问一个列表。是否有更简单的方法来访问movieTitle列表而不为每个方法创建一个新列表?我是否必须在每种方法中引用该列表?或者我应该把它们全部放在一个单独的课堂上?我的总体目标是有一个选项菜单,用于从用户获取输入,并根据输入调用列出所有电影的方法,将电影添加到列表,然后从列表中选择随机电影。

class Program
{
    static void Main(string[] args)
    {
        optionMenu();
        Console.Read();
    }
    static void optionMenu()
    {
        Console.Write("(a)LIST MOVIES|(b)ADD Movie|(c)RANDOM MOVIE");
        string ui = Console.ReadLine();
        if (ui == "a") { printNames(); }
        else if (ui == "b") { addMovie(); }
        else if (ui == "b") { randomPickMovie(); }
        else { optionMenu(); }

    }
    static void printNames()
    {
        List<string> movieTitles = new List<string>();
        /*list.....
        / movieTitles.Add("Jurassic Park");
        /..........
        /..........
        */..........


        Console.WriteLine("Movies in your list...");
        for (int i = 0; i < movieTitles.Count;i++)
        {
            Console.WriteLine("\t-" + movieTitles[i]);
        }
    } 

    static void addMovie()
    {
        Console.WriteLine("Enter a title:");
        string newTitle = Console.ReadLine();
        //I can't say...
        //movieTitles.Add(newTitle);
        //...? do I need to make an instance of the list?
    }

    static void randomPickMovie()
    {
        Random r = new Random();
        int random = r.Next();

        Console.WriteLine(movieTitle[random]);
        //same here. How do I access the movie titles in the printName()                 method so
        //I can randomly pick a movie from the list?
    }
}

3 个答案:

答案 0 :(得分:4)

以下是分享电影列表的一种方法。这声明并将列表初始化为类的静态成员(而不是方法中的局部变量)。

这种方法适用于简单程序,但在大型程序中具有全局状态可能会有问题,因为很难看出哪些方法会影响哪种全局状态,因此容易陷入错误。请参阅下面的另一种方法。

class Program
{
    static void Main(string[] args)
    {
        ...
    }

    static List<string> movieTitles = new List<string>(); 

    static void optionMenu()
    {
        ...
    }

    static void printNames()
    {
        Console.WriteLine("Movies in your list...");
        for (int i = 0; i < movieTitles.Count;i++)
        {
            Console.WriteLine("\t-" + movieTitles[i]);
        }
    } 

    static void addMovie()
    {
        movieTitles.Add(newTitle);
    }

    static void randomPickMovie()
    {
        ...
    }
}

另一种方法是将数据从一种方法传递到另一种方法。这使得查看使用movieList的方法更加明显。它还允许我们指定其他限制,例如您可以看到printNames只需要列表的只读版本,因此您知道printNames无法修改列表。这种方法稍微有些工作,但这是一个很好的习惯,因为它可以减少长期的错​​误。

class Program
{
    static void Main(string[] args)
    {
        ...
    }

    static void optionMenu()
    {
        List<string> movieTitles = new List<string>(); 
        string ui = Console.ReadLine();
        if (ui == "a") { printNames(movieTitles); }
        else if (ui == "b") { addMovie(movieTitles); }
        else if (ui == "b") { randomPickMovie(movieTitles); }
        else { optionMenu(); }
    }

    static void printNames(IReadOnlyList<string> movieTitles)
    {
        Console.WriteLine("Movies in your list...");
        for (int i = 0; i < movieTitles.Count;i++)
        {
            Console.WriteLine("\t-" + movieTitles[i]);
        }
    } 

    static void addMovie(List<string> movieTitles)
    {
        movieTitles.Add(newTitle);
    }

    static void randomPickMovie(List<string> movieTitles)
    {
        ...
    }
}

请参阅https://stackoverflow.com/questions/13295319/instance-field-vs-passing-method-parameter了解其他用户对哪种方法更好的观点。

答案 1 :(得分:2)

至于我,我更喜欢这样做。

class Program
{
    static void Main(string[] args)
    {
        Movie movie = new Movie();
        int x = 0;
        while (x < 1)
        {
            movie.optionMenu(); Console.Write("Do you want to exit?");
            string response = Console.ReadLine();
            if (response == "Y") { x = 1; }
        }
        Console.Read();
    }
}

class Movie
{
    public List<string> movieTitles { get; set; }

    public Movie()
    {
        movieTitles = new List<string>();
    }

    public void optionMenu()
    {
        Console.Write("(a)LIST MOVIES|(b)ADD Movie|(c)RANDOM MOVIE");
        string ui = Console.ReadLine();
        if (ui == "a") { printNames(); }
        else if (ui == "b") { addMovie(); }
        else if (ui == "c") { randomPickMovie(); }
        else { optionMenu(); }
    }

    public void printNames()
    {
        Console.WriteLine("Movies in your list...");
        for (int i = 0; i < movieTitles.Count; i++)
        {
            Console.WriteLine("\t-" + movieTitles[i]);
        }
    }

    public void addMovie()
    {
        Console.WriteLine("Enter a title:");
        string newTitle = Console.ReadLine();
        if (newTitle != "")
        {
            movieTitles.Add(newTitle);
            Console.WriteLine("New movie successfully added!");
        }
        else
        {
            Console.WriteLine("Cannot add empty movie. Add movie failed.");
        }
    }

    public void randomPickMovie()
    {
        if (movieTitles.Count != 0)
        {
            Random r = new Random();
            int random = r.Next(0, movieTitles.Count - 1);

            Console.WriteLine(movieTitles[random]);
        }
        else { Console.WriteLine("Movie list is empty."); }
    }
}

答案 2 :(得分:1)

回答您的所有问题是创建MovieTitles类型的List<string>属性并按以下方式访问:

class Program
{
    static void Main(string[] args)
    {
        optionMenu();
        Console.Read();
    }

    static List<string> movieTitles;

    static List<string> MovieTitles
    {
        get
        {
            if (movieTitles == null)
                CreateMoviesList();

            return movieTitles;
        }
    }

    static void CreateMoviesList()
    {
        movieTitles = new List<string>();

        /*list.....
        / movieTitles.Add("Jurassic Park");
        /..........
        /..........
        */
    }

    static void optionMenu()
    {
        Console.Write("(a)LIST MOVIES|(b)ADD Movie|(c)RANDOM MOVIE");
        string ui = Console.ReadLine();
        if (ui == "a") { printNames(); }
        else if (ui == "b") { addMovie(); }
        else if (ui == "b") { randomPickMovie(); }
        else { optionMenu(); }

    }
    static void printNames()
    {
        Console.WriteLine("Movies in your list...");
        for (int i = 0; i < MovieTitles.Count; i++)
        {
            Console.WriteLine("\t-" + movieTitles[i]);
        }
    }

    static void addMovie()
    {
        Console.WriteLine("Enter a title:");
        string newTitle = Console.ReadLine();
        MovieTitles.Add(newTitle);
    }

    static void randomPickMovie()
    {
        Random r = new Random();
        int random = r.Next();

        Console.WriteLine(MovieTitles[random]);
    }
}

CreateMoviesList()只创建一次电影列表,可以用来打印电影,稍后选择和添加电影。