列表项被更改

时间:2016-04-08 19:02:25

标签: c# list storage ram

我很确定在某个地方这个问题得到了解答,但我找不到它。

我正在从名单和数量的列表中查找对象。同一物品可以多次出现,数量不同。我想加上数量。

bool addtolist = true; //the item is not part of the list
Item currentItem = FindItem(currentMats.Name); //Find the Item in the Catalogue
currentItem.Calc(currentMats.NeededQuantity, product.Runns, product.Level + 1); //Add quantities ect
CompleteList.Add(currentItem);

问题在于: 算法第一次运行就可以了。 问题在第二次运行时出现:数量在到达第2行时被覆盖。 如何强制新对象而不是对存储中的对象的引用?

2 个答案:

答案 0 :(得分:1)

只有在使用new关键字时才会创建对象的新实例。要获得副本,您必须创建一个

您可以在Item

上创建复制构造函数,然后创建克隆方法
public Item(Item otherItem){
   variable1 = otherItem.variable1;
   variable2 = otherItem.variable2;
   ...
}

public Item Clone(){
   return new Item(this);
}

然后当你拿到物品时,克隆它

bool addtolist = true; //the item is not part of the list
Item currentItem = FindItem(currentMats.Name).Clone(); //Find the Item in the Catalogue
currentItem.Calc(currentMats.NeededQuantity, product.Runns, product.Level + 1); //Add quantities ect
CompleteList.Add(currentItem);`

答案 1 :(得分:0)

基本上你正在做的是直方图。 LINQ有一个名为GroupBy()的内置方法,可以做到这一点。请参阅以下示例代码:

public class Material
{
    public Material(string name, int quantity)
    {
        this.Name=name;
        this.Quantity=quantity;
    }
    public string Name { get; private set; }
    public int Quantity { get; private set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Material> list=new List<Material>();
        list.Add(new Material("AAA", 10));
        list.Add(new Material("BBB", 20));
        list.Add(new Material("CCC", 5));
        list.Add(new Material("AAA", 5));
        list.Add(new Material("CCC", 20));

        Console.WriteLine("{0,6} {1,6}", "Mat", "Qty");
        foreach(var item in list.GroupBy((mat) => mat.Name))
        {
            Console.WriteLine("{0,6} {1,6}", item.Key, item.Sum((mat) => mat.Quantity));
        }
        //   Mat    Qty
        //   AAA     15
        //   BBB     20
        //   CCC     25

    }
}