我很确定在某个地方这个问题得到了解答,但我找不到它。
我正在从名单和数量的列表中查找对象。同一物品可以多次出现,数量不同。我想加上数量。
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行时被覆盖。 如何强制新对象而不是对存储中的对象的引用?
答案 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
}
}