6

C# で switch または if ステートメントを使用せずに Enum を処理するにはどうすればよいですか?

例えば

enum Pricemethod
{
    Max,
    Min,
    Average
}

...そして私はクラス記事を持っています

 public class Article 
{
    private List<Double> _pricehistorie;

    public List<Double> Pricehistorie
    {
        get { return _pricehistorie; }
        set { _pricehistorie = value; }
    }

    public Pricemethod Pricemethod { get; set; }

    public double Price
    {
        get {
            switch (Pricemethod)
            {
                case Pricemethod.Average: return Average();
                case Pricemethod.Max: return Max();
                case Pricemethod.Min: return Min();
            }

        }
    }

}

switch 文を避けてジェネリックにしたい。

特定の Pricemethod に対して、特定の計算を呼び出して返します。

get { return CalculatedPrice(Pricemethod); }

ここではどのパターンを使用するか、誰かが良い実装のアイデアを持っているかもしれません。すでに状態パターンを検索しましたが、これが正しいとは思いません。

4

2 に答える 2

5

interface、およびclassそれを実装する es を作成できます。

public interface IPriceMethod
{
    double Calculate(IList<double> priceHistorie);
}
public class AveragePrice : IPriceMethod
{
    public double Calculate(IList<double> priceHistorie)
    {
        return priceHistorie.Average();
    }
}
// other classes
public class Article 
{
    private List<Double> _pricehistorie;

    public List<Double> Pricehistorie
    {
        get { return _pricehistorie; }
        set { _pricehistorie = value; }
    }

    public IPriceMethod Pricemethod { get; set; }

    public double Price
    {
        get {
            return Pricemethod.Calculate(Pricehistorie);
        }
    }

}

編集: 別の方法は a を使用して sDictionaryをマップFuncするため、このためだけにクラスを作成する必要はありません (このコードはServyによるコードに基づいており、その後回答を削除しました):

public class Article
{
    private static readonly Dictionary<Pricemethod, Func<IEnumerable<double>, double>>
        priceMethods = new Dictionary<Pricemethod, Func<IEnumerable<double>, double>>
        {
            {Pricemethod.Max,ph => ph.Max()},
            {Pricemethod.Min,ph => ph.Min()},
            {Pricemethod.Average,ph => ph.Average()},
        };

    public Pricemethod Pricemethod { get; set; }
    public List<Double> Pricehistory { get; set; }

    public double Price
    {
        get
        {
            return priceMethods[Pricemethod](Pricehistory);
        }
    }
}
于 2013-10-22T17:25:24.927 に答える