-2

DVD とブルーレイを保存する DVD アプリを持っています。ディレクターでアレイを検索したいと考えています。以下は、これを行うさまざまな方法を見た在庫クラスのコードです。これを達成するための最良/最も効率的な方法としていくつかの議論があるようですが、何か提案はありますか?

引用符

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

}

4

2 に答える 2

1

設計に欠陥があると思います。

DVD および BluRay クラスは、実際には次のいずれかである必要があります。

  1. プロパティを持つ単一のクラスType。おそらく DVD と BluRay を含む列挙型です。このように、数年後に新しいメディアを入手したら、Enum に値を追加するだけでアプリケーションが最新になります。
  2. 呼び出すことができるカスタム インターフェイスを実装する 2 つの異なるクラス、たとえばIMedia.

Listまた、配列の代わりに C#のオブジェクトを利用することを強くお勧めします。これは非常に高速で、配列のサイズを変更しなくても項目を簡単に追加/削除できます。

Linq のレッスンは次のとおりです: http://www.functionx.com/csharp/linq/Lesson09.htm

Media クラスを作成する方法は次のとおりです。

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 のリスト」機能は、実際には 1 つの機能である可能性があります。

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

ご覧のとおり、これらの手法により、LOT によるクエリが簡素化されます。:)

于 2012-12-07T22:49:48.293 に答える
0

最も簡単な(私見)はLinqを使用しています:

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));
于 2012-12-07T22:49:25.547 に答える