C# 使用合适的代码为结构上的数组赋值

C# 使用合适的代码为结构上的数组赋值,c#,arrays,struct,indexing,C#,Arrays,Struct,Indexing,这个想法很简单。为商店的部门创建一个结构,给它一个变量来命名一个名为Department的字符串,并给它一个数组来保存在该部门完成的所有购买 现在,我希望每次我要在某个特定部门保存一次购买,它会根据部门名称和购买金额自动应用折扣 现在,示例类: class Program { struct Departments { public string Department; private double[] _buys; public

这个想法很简单。为商店的部门创建一个结构,给它一个变量来命名一个名为Department的字符串,并给它一个数组来保存在该部门完成的所有购买

现在,我希望每次我要在某个特定部门保存一次购买,它会根据部门名称和购买金额自动应用折扣

现在,示例类:

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;
    }
}
请注意行部门[0]。Buys[0]=105,这就是我要保存购买的东西的方式,代码很简单

现在,请注意struct的属性,它是一个数组属性。然后,当我使用value>100条件时,它给出了一个明显的错误,不能从double转换为double[]

问题是。。。我怎样才能为值>100写一个正确的条件,为了达到这个目的,还必须在stuct上写些什么

我试过使用索引器,但只要我试过,我就无法通过部门[0]执行assignemts。以正确的方式购买[0]=105

请注意,我想保留这个模式,特别是为了简单地说departments[0]的便利。Buys[0]=105到100个buyings

编辑:


前面的结构部门仅用于示例目的。我不会回答如何通过另一种方式来拥有合适的部门,我想要一个如何使集合参数在数组的各个元素上工作的答案。你最好使用一个列表来记录购买情况。这样列表就可以动态增长。您还可以使用索引来获取列表元素

您可以使用字典简化折扣代码

对于这些数据,最好使用类,而不是结构。结构通常更好地用于不可变值。使类表示单个部门,并在其中存储适当的折扣

比如说:

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

我还有很多其他的方法可以改进这个设计,但这应该会让你有所进步。

你最好用一个列表来记录购买情况。这样列表就可以动态增长。您还可以使用索引来获取列表元素

您可以使用字典简化折扣代码

对于这些数据,最好使用类,而不是结构。结构通常更好地用于不可变值。使类表示单个部门,并在其中存储适当的折扣

比如说:

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

我还有很多其他的方法可以改进这个设计,但这应该会让你成功。

由于你的错误,你可以这样做

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

由于你的错误,你可以这样做

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

您可以创建一个方法来执行如下设置:

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

您可以创建一个方法来执行如下设置:

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

另一个可能的解决方案是为_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;
}

另一个可能的解决方案是为_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;
}

你可以这样做

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

}
但是,通过将折扣放入setter本身,您无法保持良好的关注点分离。更好的代码应该是

departments[0].Buys[0] = DiscountFor("department1") * 105;

你可以这样做

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

}
但是,通过将折扣放入setter本身,您无法保持良好的关注点分离。更好的代码应该是

departments[0].Buys[0] = DiscountFor("department1") * 105;

包含对可变项的可变引用的结构通常是个坏主意,因为这样的结构最终表现出值和引用语义的奇怪组合。例如,以下情况的影响是什么:

Departments dep1,dep2; ... dep1 = dep2; dep1.Department = "CLOTH"; dep1.Buys[5] = 123;
这种说法是否会或应该影响dep2.Buys[5],这一点并不明显。如果给定结构的字段/属性总是引用同一个数组,这种语义可能是可以接受的,但是如果数组需要调整大小,会发生什么情况呢?

包含对可变项的可变引用的结构通常是个坏主意,因为这样的结构最终表现出一种奇怪的值和引用语义的组合。例如,以下情况的影响是什么:

Departments dep1,dep2; ... dep1 = dep2; dep1.Department = "CLOTH"; dep1.Buys[5] = 123;
这种说法是否会或应该影响dep2.Buys[5],这一点并不明显。如果给定结构的Buys字段/属性总是引用同一数组,这种语义可能是可以接受的,但是如果需要调整数组的大小,会发生什么情况?

您不希望部门成为结构。这不是一种价值,不要把它当作一种价值。你的二传手被水套住了。它设置的是一个数组,而不是一个数组中的单个元素。重新考虑你的方法。@AnthonyPegram它是设置一个数组,而不是单个元素。同样的!谢谢你的话,很难找到这些话xD。那么,如何设置数组的各个元素呢?抛弃部门,就像抛弃结构一样,最后我想要一个关于如何使集合在数组的各个元素上工作的答案我正在努力改变问题的焦点,因为真正的问题不是要建立一个正确的部门,真正的问题是在数组的各个元素上使用集合。你不想

部门是一个结构。这不是一种价值,不要把它当作一种价值。你的二传手被水套住了。它设置的是一个数组,而不是一个数组中的单个元素。重新考虑你的方法。@AnthonyPegram它是设置一个数组,而不是单个元素。同样的!谢谢你的话,很难找到这些话xD。那么,如何设置数组的各个元素呢?抛弃部门,就像抛弃结构一样,最后我想要一个关于如何使集合在数组的各个元素上工作的答案我正在努力改变问题的焦点,因为真正的问题不是如何创建一个正确的部门,真正的问题是在数组的各个元素上使用集合,我知道我只是把事情复杂化了,但我对最终的应用程序也有一些限制。丢弃制作列表、堆栈等。。。如果需要,尽可能多地使用数组。另外,放弃折扣是可分配的,它是固定的,我不想把它作为参数传递。有了所有这些,我认为唯一的解决办法是制定一种特殊的方法,即获取买入金额和指数位置,然后做所有的魔术工作。有了set thing,就没有办法了,我能不能让它指向数组的各个元素,并按Property[index]的方式使用它?其他选项请参见我的其他答案。底线是无法为数组的元素创建setter。不过,您可以将数组包装到另一个类中并使用索引器。我的另一个答案显示了这一技巧。现在假设以下情况,我知道我只是让事情复杂化了,但我对最终的应用程序也有一些限制。丢弃制作列表、堆栈等。。。如果需要,尽可能多地使用数组。另外,放弃折扣是可分配的,它是固定的,我不想把它作为参数传递。有了所有这些,我认为唯一的解决办法是制定一种特殊的方法,即获取买入金额和指数位置,然后做所有的魔术工作。有了set thing,就没有办法了,我能不能让它指向数组的各个元素,并按Property[index]的方式使用它?其他选项请参见我的其他答案。底线是无法为数组的元素创建setter。不过,您可以将数组包装到另一个类中并使用索引器。我的另一个答案显示了这个技巧。现在,因为for循环将润色之前存储的所有_购买。。。一种避免这种情况的方法?好的。现在,因为for循环将润色之前存储的所有_购买。。。一种避免这种情况的方法?已经将此作为对您先前答案的评论;。抛开这个概率,有没有一种方法可以解决这个问题?希望有…已经将此作为对您之前答案的评论;。抛开这个概率,有没有一种方法可以解决这个问题?希望有…这是我想要的东西!谢谢!为什么老师们对编码有这么大的限制?仅供参考,我在这里重申,底线是,无法为array@mishamosher因为这个设计会烧掉任何需要维护代码的人。@Yaur我知道。。。但我是唯一的曼塔纳:P。这不是一个真实的应用程序,它是一个简单的家庭作业,让我对数组的集合和元素产生了怀疑,这是安德鲁已经回答的问题的核心Cooper@Andrew库珀直到现在我才意识到系里的人不可能上课。我改变了它并应用了继承,所以,现在我使用类而不是结构。这就是我想要的!谢谢!为什么老师们对编码有这么大的限制?仅供参考,我在这里重申,底线是,无法为array@mishamosher因为这个设计会烧掉任何需要维护代码的人。@Yaur我知道。。。但我是唯一的曼塔纳:P。这不是一个真实的应用程序,它是一个简单的家庭作业,让我对数组的集合和元素产生了怀疑,这是安德鲁已经回答的问题的核心Cooper@Andrew库珀直到现在我才意识到系里的人不可能上课。我改变了这一点并应用了继承,所以,现在我使用的是类而不是结构。我更喜欢Andrew Cooper的答案中的做法,更简单,我可以应用嵌套保留可读代码可能设计得不好,但可以理解。无论如何,这是一个解决方案,感谢Andrew Cooper的回答中所采用的方法,更简单,我可以应用嵌套保护可读代码可能设计得不好,但可以理解。无论如何,这是一个解决方案,谢谢你的信息好友,但是,在这种特殊的情况下,这是一个没有太多需要的家庭作业,但是,它有限制:老师用这些练习扼杀了学生的聪明才智,我真的很感谢所有这些答案,因为他们打开了我的心扉。。。普遍地再次感谢你的信息好友,但是,在这种特殊的情况下,它是一个hom 虽然没有太多需要的作业,但也有一些限制:美国老师通过这些练习扼杀了学生的聪明才智,我真的很感谢所有这些答案,因为他们开阔了我的思路。。。普遍地再一次,谢谢