1

考え方は単純です。ストアの「部門」の構造体を作成し、名前付け用の変数 (「部門」という文字列) と、その部門で行われたすべての購入を保存するための配列を指定します。

ここで、特定の部門で購入を保存するたびに、部門の名前と購入金額に基づいて割引が自動的に適用されるようにしたいと考えています。

さて、サンプルクラス:

class Program
{
    struct Departments
    {
        public string Department;
        private double[] _buys;

        public double[] Buys
        {
            get { return _buys; }
            set
            {
                if (value > 100)
                {
                    if (Department == "CLOTH")
                    _buys = value * .95;
                    if (Department == "FOOD")
                    _buys = value * .90;
                    if (Department == "OTHER")
                    _buys = value * .97;
                }
                _buys = value;
            }
        }
    }

    static void Main()
    {
        var departments = new Departments[3];
        departments[0].Department = "CLOTH";
        departments[1].Department = "FOOD";
        departments[2].Department = "OTHER";
        departments[0].Buys = new double[5];
        departments[0].Buys[0] = 105;
    }
}

「Code-Simple」という行に注意してください。これは、departments[0].Buys[0] = 105購入したものを保存したい方法です...

ここで、構造体のプロパティに注意してください。これBuysは「配列プロパティ」です。次に、value > 100条件を使用すると、明らかなエラーが発生し、からdoubleにキャストできませんdouble[]

質問... の正しい条件をどのように書くことができますvalue > 100か?

「インデクサー」を試してみましたが、試した限りdepartments[0].Buys[0] = 105、正しい方法で割り当てを行うことはできません。

このスキーマを保持したいことに注意してください。特に、購入を簡単に言うdepartments[0].Buys[0] = 105ためです。

編集:

前の構造体 "Departments" は、例としてのみ使用されています。別の方法で正しい「部門」を作成することについては回答しません。配列の個々の要素で設定されたパラメーターを機能させる方法の回答が必要です

4

6 に答える 6

2

もう 1 つの潜在的な解決策は、_buys 配列用に別のクラスを作成することです。

class Buys
{
    private double[] _buys;

    public Buys (int capacity)
    {
        _buys = new double[capacity];
    }

    public double this[int index]
    {
        get { return _buys; }
        set 
        {
            if (value > 100)
            {
                if (Department == "CLOTH")
                    value = value * .95;
                if (Department == "FOOD")
                    value = value * .90;
                if (Department == "OTHER")
                    value = value * .97;
            }
            _buys = value;
        }
    }
}

struct Departments
{
    public string Department;
    public Buys Buys;
}

static void Main()
{
    var departments = new Departments[3];
    departments[0].Department = "CLOTH";
    departments[1].Department = "FOOD";
    departments[2].Department = "OTHER";
    departments[0].Buys = new Buys(5);
    departments[0].Buys[0] = 105;
}
于 2012-04-05T03:21:24.687 に答える
1

List<double>を使用して購入を記録した方がよいでしょう。そうすれば、リストを動的に拡張できます。インデックスを使用してリスト要素を取得することもできます。

辞書を使用して割引コードを簡略化できます。

classこのデータについては、 ではなくを使用したほうがよいでしょうstructStructs は通常、不変の値に使用する方が適しています。クラスが 1 つの部門を表すようにし、適切な割引をそこに格納します。

だから、このようなもの:

class Program
{
    class Department
    {
        public string Name;
        public double Discount;

        private List<double> _buys = new List<double>();

        public List<double> Buys
        {
            get { return _buys; }
        }

        public void AddBuy(double value)
        {
            _buys.Add(value > 100 ? value * discount : value);
        }
    }

    static void Main()
    {
        var departments = new List<Department>();
        departments.Add(new Department { Name = "CLOTH", Discount = 0.95 });
        departments.Add(new Department { Name = "FOOD", Discount = 0.90 });
        departments.Add(new Department { Name = "OTHER", Discount = 0.97 });
        departments[0].AddBuy(105);

        Console.WriteLine(departments[0].Buys[0]);
    }
}

このデザインを改善する方法は他にもたくさんありますが、これでうまくいくはずです。

于 2012-04-05T03:03:38.300 に答える
1

あなたはこのようなことをすることができます

public class Departments
{
    public string Department;
    public MyList buys;
    public Departments()
    {
        buys = new MyList(this, 5);
    }
}
public class MyList
{
    private double[] backingList;
    private Departments owner;
    public MyList(Departments owner, int size)
    {
        this.owner = owner;
        backingList = new T[size];
    }

    public double this[int index]
    {
        get{ return backingList[index]; }
        set { backingList[index] = discountFor(owner.Department) * value; }
    }

    private float discountFor(string department)
    {
        switch(department)
        {
        case "department1":
            return 0.5f;
        //...
        default:
             return 1.0f;
        }
    }

}

ただし、割引をセッター自体に入れることで、懸念の適切な分離を維持していません。より良いコードは次のようになります

departments[0].Buys[0] = DiscountFor("department1") * 105;
于 2012-04-05T03:31:56.497 に答える
0

次のような設定を行うメソッドを作成できます。

        public double[] Buys { get; set; }

        public void SetBuy(int index, double value)
        {
           if (value > 100)
           {
              if (Department == "CLOTH")
               value = value * .95;
              if (Department == "FOOD")
               value = value * .90;
              if (Department == "OTHER")
               value = value * .97;
           }
           _buys[index] = value;
        }
于 2012-04-05T03:11:16.517 に答える
0

変更可能なアイテムへの変更可能な参照を含む構造体は、一般に悪い考えです。そのような構造体は、値と参照のセマンティクスの奇妙な組み合わせを示すことになるからです。たとえば、次のような効果があります。

  部門 dep1,dep2;
  ...
  dep1 = dep2;
  dep1.Department = "布";
  dep1.Buys[5] = 123;

そのようなステートメントが に影響を与えるか、影響を与えるべきかはほとんど明らかではありませんdep2.Buys[5]。特定の構造体のBuysフィールド/プロパティが常に同じ配列を参照する場合、そのようなセマンティクスは許容できるかもしれませんが、配列のサイズを変更する必要がある場合はどうなりますか?

于 2012-04-07T21:17:17.590 に答える
0

あなたのエラーによって、このようなことができます。

struct Departments
    {
        public string Department;
        private double[] _buys;
        public double[] Buys
        {
            get { return _buys; }
            set
            {
                for (int i = 0; i < value.Length; i++)
                {
                    if (value[i] > 100)
                    {
                        if (Department == "CLOTH")
                            _buys[i] = value[i] * .95; if (Department == "FOOD")
                            _buys[i] = value[i] * .90; if (Department == "OTHER")
                            _buys[i] = value[i] * .97;
                    }
                }
                _buys = value;
            }
        }
    }
于 2012-04-05T03:05:48.150 に答える