C#でレート別に管理するクラスを作りたい

このQ&Aのポイント
  • C#で本の管理にレート別に分けるクラスを作りたいです。固定された1〜5のレートを持ち、それぞれのレートに該当する本のリストを管理したいです。
  • 基底クラスを作って、それぞれのレートに対応するサブクラスを作成する方法と、グループ名と本のリストを持つクラスを作成する方法を考えていますが、どちらが良いか悩んでいます。
  • どのようにしてレート別の本のグループを管理するのか、効率的な方法や考え方についてアドバイスをお願いします。
回答を見る
  • ベストアンサー

C#でレート別に管理するクラスを作りたい

本の管理をするアプリを作っている時にまた疑問が出てきました。 public class Book { public string Title { get; set; } public string ISBN { get; set; } public Money Money { get; set; } public int Rate { get; set; } public DateTime BuyDate { get; set; } } 本の管理にレートをつけられるようにしようと思っています。 iTunesの★マークのようなものにしたいので1~5の固定です。 つけていないものもあるので0も存在します。 ここでレートを付けている本を、それぞれのレート別にグループに分けたいと思いました。 そこでレート1~レート5までのグループをどのように管理するのがベストというか、どのように考えればいいのでしょうか。 私が考えたのは、グループ別に処理が分かれるのでクラスを作った方がいいと考えたのです。 とりあえず同じ処理もいくつか発生するので public abstract class AbstractRate { public int Value { get; set; } private static BookCollection _bookCollection; //全ての本が入る public BookCollection BookCollection { get { return _bookCollection; } } } みたいな基底クラスを作り public class Star1 :AbstractRate { private BookCollection _books; } から Star5までの似たようなクラスを作り、それぞれのレートのBookコレクションを持たせる形です。 ただこれだと同じようなクラスが増えるだけでものすごく冗長だと思うのです そこでもう一つ思ったのは public class GroupClass { public string GroupName { get; set; } public BookCollection BookCollection { get; set; } } という形でグループ名と本のリストを入れておく形です。 これだとクラスは分かりやすくていいのですが、毎回処理をさせる際にこの名前のグループならこれみたいな処理が必要になる気がして悩んでいます。 実際どのように考えるのがいいのでしょうか? 直接的な回答でなくてもいいのですが、考える材料が欲しいです。 よろしくお願いします。

noname#212926
noname#212926

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

AllBooks=全ての本の情報 みたいにして、 http://dobon.net/vb/dotnet/programing/arrayfilter.html にあるような方法で、必要に応じて Star5 = Allbooks.フィルタ(Rate-5を検索) のように抽出して foreach(book in Star5 ){ 星5の処理; } と該当したものだけ処理をする。 というのが素直でいいと思います。 別解。 データはデータベースに保存する。 必要なときに、必要なものだけを抽出したり更新したりする。

noname#212926
質問者

お礼

お礼が遅くなって申し訳ないです。 ifで回さなくても個別に抽出して回せば確かに自然ですね! データベースはまだこれからなので、とりあえず前者の方法でやってみて、のちにデータベースでも試してみたいと思います。 ありがとうございました!

関連するQ&A

  • C#クラスについて教えてください

    下記通りクラスを作成した場合、プロパティaを配列にできますか? class Class1 { public string a { set; get; } public int b { set; get; } public int c { set; get; } } イメージとしては下記通りにしたいのですが、なかなかうまく行きません。 class Class1 { public Class1(int x) { } public string a[x] { set; get; } public int b { set; get; } public int c { set; get; } } private void Form1_Load(object sender, EventArgs e) { Class1 f = new Class1(2); f.a[0] = "asdf"; f.a[1] = "asdfa"; f.a[2] = "asdfasd"; f.b = 1; f.c = 2; } 初心者なんで、やさしく教えてください。お願いします。

  • 永続化前後のクラスの表現について C#

    ものすごくくだらない質問ですみません。 リレーショナルデータベースを使わざるを得なく、O/Rマッピングツールは使えない状況です。 class Employee があります。 StaffCodeがありますが、将来このコードが重複はありませんが変わる可能性があるので永続化を目的としてこれを主キーとして使えません。 そこで主キーにサロゲートキーを使おうと考えました。 アプリ側で対応するよりもデータベース側でオートナンバーを使います。 一応下記コードでこれから採番する社員と、永続化&採番したあとの社員を表現する事はできます。 しかし同じクラスを使うものなのでしょうか? クラスを分けるべきでしょうか? そもそも考え方がおかしいですか? Class Employee { Public Int Id { get; private set; } Public String Name { get; private set; } Public Int StaffCode { get; private set; } Public Employee(String name, Int staffCode) { this.Name = name; this.StaffCode = staffCode; } Public Employee(Int id, String name, Int staffCode) { this.Id = id; this.Name = name; this.StaffCode = staffCode; } Public Void SetId(Int id) { this.Id = id; } }

  • クラス作成

    C#にてクラス作成をしております。その中で疑問に思った点を質問させていただきます。 画像を枠内に表示させるクラス 実装すべき変数:枠番号、パス、 映像を枠内に流すクラス 実装すべき変数:枠番号、パス、再生時間 Flashを枠内に流すクラス 実装すべき変数:枠番号、パス など色々なクラスがあってそれをまとめたクラスを作成中です。 上記のクラスを実装するにあたって、共通の変数はクラスにしてしまい それを継承しましょうと言う指示がありました。これはどういった使い方をするものなのでしょうか? class Class2 { public int no { get; set; } public string path { get; set; } } class Movie : Class2 {    public float time{get;set;} public void Play(int frameNo, string path, float playtime){} } class Picture: Class2 {    public void Show(int frameNo, string path){} } これをForm1.cs内で Class2 cls = new Class2(); cls.path = "C:\\test"; cls.no = 11; とかすれば MovieやPictureで使いまわしができると思いきや MovieやPictureをNewすれば初期化されてしまう為、何か根本的に 私の考えが間違ってると思います。 共通の変数を別のクラスにしておいて継承して使うというのはどういった使い方をするのでしょうか? よろしければ例で教えていただけないでしょうか

  • interface プロパティ

    【ケース1】 class Class1 { public string str { get; set; } public int x { get; set; } } 【ケース2】 class Class1 : Class2, Class3 { public string str { get; set; } public int x { get; set; } } interface Class2 { int x { get; set; } } interface Class3 { string str { get; set; } } インターフェースのプロパティの実装をしています、【ケース2】です。 これと【ケース1】ってどこがどう違うのでしょうか?何か同じな感がぬぐえません class2とclass3のプロパティを再定義してるという感がしません。。 実装の仕方がまちがってる場合はご指摘ください。お願いします。

    • ベストアンサー
    • Java
  • C#でプロパティを使わずXMLにデータを保存したい

    C#を使っているのでC・C++のジャンルでいいのか分からないのですがこちらで質問させて下さい。 現在簡単な本の管理をするアプリを作っています。 プロパティをできるだけ使わずにカプセル化して作っていたのですが、肝心のデータを保存する段階で分からなくなりました。 public class Book { private static int _id_gen; private int _id2; private string _isbn; private string _name; public Book(string isbn, string name) { this._isbn = isbn; this._name = name; } } このようにコンストラクタでデータを渡して get プロパティだけあとで追加するようにしています。 こういうデータを保存する際はまとめて保存するのではなくて List<Book> なんかを foreach で回して1件ずつ保存するといいのでしょうか? 読み込む際は1件ずつ読み込んでクラスに設定していくというのが標準的な考え方ですか? 「C# XML 保存」で検索をかけると XmlSerializer でまとめて保存する事例ばかりでちょっと分からなくなってしまいました。 よろしくお願いします。

  • C シャープ クラスについて

    C#のカテゴリが無く、その他(プログラミング)とどちらにしようか迷ったのですがこちらで質問します。 C#初心者です。今クラスについて勉強しているのですが、不思議に思うことがあるので質問します。 以下のコードは使っている教科書に載っているサンプルコードの一部です。 public class Student { //Data members, data fields, or characteristics private int studentNumber; private string studentName; private int score1; private int score2; private int score3; private string major; //default constructor public Student() { } //constructor with one argument public Student(int sID) { studentNumber = sID; } //constructor with two arguments public Student(int sID, string name) { studentNumber = sID; studentName = name; } //constructor with six arguments public Student(int sID, string name, int s1, int s2, int s3, string maj) { studentNumber = sID; studentName = name; score1 = s1; score2 = s2; score3 = s3; major = maj; } (・・・その後もプロパティコードが続く) Constructorにはクラス名と同じ名前を使うと解釈しているのですが、どうやって識別しているのでしょう? 例えば、Main()内で Student thirdStudentObject = new Student(5432, "Randolph Wonder"); と Student aStudentObject = new Student(1234, "Maria Smith", 97, 75, 87, "CS"); というコードがあるのですが、 Student thirdStudentObject = new Student(5432, "Randolph Wonder"); は public Student(int sID, string name) { studentNumber = sID; studentName = name; }、 Student aStudentObject = new Student(1234, "Maria Smith", 97, 75, 87, "CS"); は public Student(int sID, string name, int s1, int s2, int s3, string maj) { studentNumber = sID; studentName = name; score1 = s1; score2 = s2; score3 = s3; major = maj; } を呼び出しているのですよね? 上記の文では必要なアーギュメントが2個と6個なので数の違いからどのConstructorを使っているのかなんとなく分かりますが、もしも public Student(int sID, string name) { studentNumber = sID; studentName = name; } と public Student(int sID, string SchoolName) { studentNumber = sID; studentName = SchoolName; } などのように同じアーギュメント数もしくは同じデータタイプの場合、どうやって「どのConstructorを使うか」を識別させるのでしょうか? 同一クラス内に同じ数のアーギュメントを求めるものは作ってはいけなかったりするのでしょうか? 長い上に分かりづらい質問ですみません。

  • VC++2008で、自作クラスの配列を使う方法は

    下記のようなクラスを作りました。 ref class Card { private: String^ name; // カード名 DateTime date; // 直近引落日 int money; // 直近精算金額 DateTime date2; // 来月引落日 int money2; // 金額 DateTime 3月後; private: 以下省略 プロパティー、コンストラクタ等は、設定しています。 呼び出し側で、以下のように配列宣言し、インスタンス化しました。 private:array<Card^>^ orgCard; this->orgCard=gcnew array<Card ^>(3); これで、 orgCard-> としても、インテリセンスにこのクラス各フィールドが表示されません。どうしたらいいのでしょうか? 説明不足かもしれませんが、よろしくお願いします。

  • エレメントクラス?

    Javaを勉強しているのですが、 web系で有るJavaBeansのような機能を javaアプリケーソン等でもエレメントクラス?と言って使えるらしいのですが、 どの様に使えばいいのでしょうか、 JavaBeansだと public class 名前{ private String num; public void setNumd(String num)  { this. num= num;  } public String getNum()  {    return this.num; } } この様な構造で、 newしてセットやゲットしいたりすると思いますが(サーブレット上)、 エレメントクラスではどうしたらいいのか分かりません? エレメントクラスの構造は基本構造はJavaBeans(上記)と同じで、 public class 名前{ private String num;  コンストラクタ( String num ) { setNum(num) } コンストラクタ( クラス型 名) { this. num= num; } public void setNumd( String num )  { this. num= num;  } public String getNum()  {    return this.num; } } 上記の様に2つのコンストラクタ追加された構造らしいのですが、 JavaBeansの同じようにnewしてセットやゲットしいようとしてもうまく出来ません? 教えてもらったエレメントクラスで調べても言葉としては出てくるのですが、 詳しい情報がなくセットやゲットしかたや構造が上記の様でいいのか分かりません、 まだ、初歩の初歩までしかやっていないので済みませんが教えて下さい。

  • C#プロパティが変わったらイベントがほしい

    C#でクラスを作成していますが、クラス内でとある条件になるとプロパティに値が設定されます。その時、メインのプログラムから感知できませんか? class Class1 { public string MyProperty { get; set; } public void ReadText() { bool ret = false; if (ret) MyProperty = "発見しました。"; } } 上記サンプルでMyPropertyがセットされた時、上位プログラムで処理を行いたいです。 お願いします。

  • 四則計算するクラス・・・

    始めまして。 java初心者です。 四則計算するプログラムをbeanにて計算する方法でしたいのですが、計算をするクラス作成で行き詰まりました。 ※HTMLにて数値1(suuchi1)と数値2(suuchi2)を入力 public class keisannhouhou{ private int suuchi1; private int suuchi2; private String tasizan; private String hikizan; private String kakezan; private String warizan; void setTasizan(String aTasizan){ tasizan = (suuchi1 + suuchi2); } String getTasizan(){ return tasizan; } void setHikizan(String aHikizan){ hikizan = (suuchi1 - suuchi2); } String getHikizan(){ return hikizan; ・ ・ ・ と足し算から割り算まで続くのですが、カッコ内の演算子が「互換性のない型」と言われてコンパイルできません。 検出値はintで、期待値はjava.lang.Stringと表示されています。 根本的に間違えてるかもですが、宜しくお願いします。