私は本のライブラリアプリを構築しています。抽象的な本のクラス、2種類の派生本、および本のジャンルを保存する2つの列挙型があります。各本は、1つ以上のジャンルに関連付けることができます。
abstract public class Book
{
public int Price { get; set; }
...
}
public enum ReadingBooksGenre
{
Fiction,
NonFiction
}
public enum TextBooksGenre
{
Math,
Science
}
abstract public class ReadingBook : Book
{
public List<ReadingBooksGenre> Genres { get; set; }
}
abstract public class TextBook : Book
{
public List<TextBooksGenre> Genres { get; set; }
}
今、私は本のジャンルに基づいて割引を保存したいので(二重割引はなく、最高の割引のみが計算されます)、次のように、各ジャンルのすべての割引を保存する2つの辞書を作成することを考えています。
Dictionary<ReadingBooksGenre, int> _readingBooksDiscounts;
Dictionary<TextBooksGenre, int> _textBooksDiscounts;
だから今、私は最高の割引を見つけるために各本のジャンルをチェックする必要があります、それを行うためのより良い方法はありますか?
private int GetDiscount(Book b)
{
int maxDiscount = 0;
if (b is ReadingBook)
{
foreach (var genre in (b as ReadingBook).Genres)
{
// checking if the genre is in discount, and if its bigger than other discounts.
if (_readingBooksDiscounts.ContainsKey(genre) && _readingBooksDiscounts[genere]>maxDiscount)
{
maxDiscount = _readingBooksDiscounts[genere];
}
}
}
else if (b is TextBook)
{
foreach (var genre in (b as TextBook).Genres)
{
if (_textBooksDiscounts.ContainsKey(genre) && _textBooksDiscounts[genere]>maxDiscount)
{
maxDiscount = _textBooksDiscounts[genere];
}
}
}
return maxDiscount;
}
タイプをチェックせずに正しい辞書を選択する方法はありますか?または、辞書なしで、または辞書を使用してそれを行う方法でさえありますか?多分どういうわけか本の種類を列挙型に接続しますか?
改善のための提案を聞いて喜んでいます。
(本の名前、日付、著者に基づいてさらに多くの割引があります。さらにいくつかの本の種類があるため、この方法は私には正しくないようです)
ありがとうございました。