Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# C:在数组中搜索_C#_Arrays_Search - Fatal编程技术网

C# C:在数组中搜索

C# C:在数组中搜索,c#,arrays,search,C#,Arrays,Search,我有一个存储dvd和蓝光的dvd应用程序,我想通过director搜索阵列。下面是inventory类的代码,我看到了许多不同的方法。似乎有一些争论认为这是实现这一目标的最佳/最有效的方法,有什么建议吗 大宗报价 namespace MovieInventoryApplication { class Inventory { public Bluray[] BlurayMovies; public DVD[] DVDMovies; private int blur

我有一个存储dvd和蓝光的dvd应用程序,我想通过director搜索阵列。下面是inventory类的代码,我看到了许多不同的方法。似乎有一些争论认为这是实现这一目标的最佳/最有效的方法,有什么建议吗

大宗报价

    namespace MovieInventoryApplication
{
class Inventory
{
    public Bluray[] BlurayMovies;
    public DVD[] DVDMovies;

    private int blurayCount;
    private int dvdCount;

    public Inventory()
    {
        BlurayMovies = new Bluray[5];
        DVDMovies = new DVD[5];

        blurayCount = 0;
        dvdCount = 0;
    }

    public void AddBluray()
    {
        String strTitle;
        int intReleaseYear;
        int intRunningTimeMinutes;
        String strDirector;
        int intPrice;
        int intRegionCode;

        try
        {
            Console.Write("Enter a title: ");
            strTitle = Console.ReadLine();

            Console.Write("Enter a release year: ");
            intReleaseYear = Convert.ToInt32(Console.ReadLine());

            Console.Write("Enter the running time in minutes: ");
            intRunningTimeMinutes = Convert.ToInt32(Console.ReadLine());

            Console.Write("Enter the directors name: ");
            strDirector = Console.ReadLine();

            Console.Write("Enter a rental price: ");
            intPrice = Convert.ToInt32(Console.ReadLine());

            BlurayMovies[blurayCount] = new Bluray(strTitle, intReleaseYear, intRunningTimeMinutes, strDirector, intPrice);
            blurayCount++;

            Console.Write("Enter the DVD region code: ");
            intRegionCode = Convert.ToInt32(Console.ReadLine());

            DVDMovies[dvdCount] = new DVD(strTitle, intReleaseYear, intRunningTimeMinutes, strDirector, intPrice, intRegionCode);
            dvdCount++;
        }
        catch (FormatException FormatException)
        {
            Console.WriteLine(FormatException.Message);
            Console.WriteLine("Please enter a number in this field.");
        }
    }

    public void AddDVD()
    {
        String strTitle;
        int intReleaseYear;
        int intRunningTimeMinutes;
        String strDirector;
        int intPrice;
        int intRegionCode;

        try
        {
            Console.Write("Enter a title: ");
            strTitle = Console.ReadLine();

            Console.Write("Enter a release year: ");
            intReleaseYear = Convert.ToInt32(Console.ReadLine());

            Console.Write("Enter the running time in minutes: ");
            intRunningTimeMinutes = Convert.ToInt32(Console.ReadLine());

            Console.Write("Enter the directors name: ");
            strDirector = Console.ReadLine();

            Console.Write("Enter a rental price: ");
            intPrice = Convert.ToInt32(Console.ReadLine());

            Console.Write("Enter the region code: ");
            intRegionCode = Convert.ToInt32(Console.ReadLine());

            DVDMovies[dvdCount] = new DVD(strTitle, intReleaseYear, intRunningTimeMinutes, strDirector, intPrice, intRegionCode);
            dvdCount++;
        }

        catch (FormatException FormatException)
        {
            Console.WriteLine(FormatException.Message);
            Console.WriteLine("Please enter a number in this field.");
        }
    }

    public void ListAllBluray()
    {
        int position = 0;

        while (BlurayMovies[position] != null)
        {
            Console.WriteLine(position + " " + BlurayMovies[position].strTitle);

            position++;
        }
    }

    public void ListAllDVD()
    {
        int position = 0;

        while (DVDMovies[position] != null)
        {
            //position + 1 + " " + 
            Console.WriteLine(position + " " + DVDMovies[position].strTitle);

            position++;
        }
    }

    public void BlurayInfo(int position)
    {
        Console.WriteLine("Title: {0}", DVDMovies[position].strTitle);
        Console.WriteLine("Release Year: {0}", DVDMovies[position].intReleaseYear);
        Console.WriteLine("Running Time (Minutes): {0}", DVDMovies[position].intRunningTimeMinutes);
        Console.WriteLine("Director: {0}", DVDMovies[position].strDirector);
        Console.WriteLine("Price: {0}", DVDMovies[position].intPrice);
    }

    public void DVDInfo(int position)
    {
        Console.WriteLine("Title: {0}", DVDMovies[position].strTitle);
        Console.WriteLine("Release Year: {0}", DVDMovies[position].intReleaseYear);
        Console.WriteLine("Running Time (Minutes): {0}", DVDMovies[position].intRunningTimeMinutes);
        Console.WriteLine("Director: {0}", DVDMovies[position].strDirector);
        Console.WriteLine("Price: {0}", DVDMovies[position].intPrice);
        Console.WriteLine("Region Code: {0}", DVDMovies[position].intRegionCode);
    }
}

}最容易使用Linq的imho是:

string director = "Alfred Hitchcock";
IEnumerable<DVD> dvds = DVDMovies.Where(dvd => dvd.Director == director);
IEnumerable<DVD> blueRays = BlurayMovies.Where(br => br.Director == director);
List<DVD> allMatches = new List<DVD>();
allMatches.AddRange(dvds.Concat(blueRays));

我认为你的设计有缺陷

DVD和BluRay课程实际上应该是:

具有类型属性的单个类,可能是包含DVD和BluRay的枚举。这样,在几年内,一旦您获得了一种新媒体,您只需向Enum添加一个值,您的应用程序将是最新的。 两个不同的类实现了一个自定义接口,您可以调用,比如说,IMedia。 另外,我强烈建议您利用C中的List对象,而不是数组。它非常快速,您可以轻松添加/删除项目,而无需调整阵列大小

以下是关于Linq的一节课:

下面是我创建媒体类的方法:

public class Media
{
    public enum MediaType
    {
        DVD,
        Bluray
    }

    public MediaType TypeOfMedia { get; set; }
    public string Director { get; set; }
    public string Title { get; set; }

    public Media(string Title, string Director, MediaType TypeOfMedia)
    {
        this.TypeOfMedia = TypeOfMedia;
        this.Director = Director;
        this.Title = Title;
    }
}
下面是一个如何使用它的示例:

        List<Media> data = new List<Media>();

        results.Add(new Media("Movie 1", "John D", Media.MediaType.DVD));
        results.Add(new Media("Movie 2", "John D", Media.MediaType.DVD));
        results.Add(new Media("Movie 3", "SomeOtherDirector", Media.MediaType.Bluray));
        results.Add(new Media("Movie 4", "John D", Media.MediaType.Bluray));

        IEnumerable<Media> listDirectors = from media in data
                                           where media.Director == "John D"
                                           select media;

        foreach (Media media in listDirectors)
            Console.WriteLine(media.Title);
另一个示例是,列表DVD和列表Bluray函数实际上可以是一个函数:

    private void ListMediaByType(List<Media> data, Media.MediaType type)
    {
        foreach (Media media in data.Where(media => media.TypeOfMedia == type))
            Console.WriteLine(media.Title);
    }

如您所见,这些技术大大简化了查询:

争论是什么?您尝试过什么?比如results=Array.FindAllarr、s=>s.Equalstarget或bool has=arr.Containsvar。我见过很多不同的WaySTime,不幸的是,他使用的是两个不同的类DVD和Bluray-我不认为你可以从Bluray数组生成IEnum。我意识到列表更有意义,但我会坚持使用array@Joe:代码有点混乱,但他只使用了一类DVD。您必须查看AddXYZ方法。@JonathanOberhaus:您没有提到结果集合也应该是数组。但它很简单:DVD,ConcatBlueray,ToArray,哦,真的。不过,这是无法维护的代码,因此我建议增强DVD类以包含任何类型的媒体。顺便说一下,使用阵列也可以实现上述所有功能!在ListMediaByType中,可以随意将列表更改为Media[]。