2016-04-08 27 views
1

Bu soruyu bir yerlerde cevapladım ama bulamadığımdan eminim.Liste Öğe değiştirildi

Nesneleri ad ve nicel bir listeden arıyorum. Aynı Öğe farklı miktarlarda birkaç kez ortaya çıkabilir. Miktarları eklemek istiyorum. İşte

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

sorundur: Algoritma tüm ok çalışan ilk kez. Sorun, ikinci aşamada ortaya çıkıyor: miktar, satır 2'ye ulaştığı anda geçersiz kılılıyor. Yeni bir nesneyi nasıl depolayabilirim?

+1

Ben öğelerin tanımıdır "miktar" –

+0

denilen şey değiştirir kod parçası bulamıyorum: Aşağıdaki örnek kodu bakın? Bir sınıf mı yoksa bir yapı mı? Calc() işlevi nedir? Bu soruyu çok belirsiz bir şekilde cevaplamak zordur. – ja72

cevap

1

Nesnenin yeni bir örneği, yalnızca new anahtar sözcüğü kullanıldığında oluşturulur. Bir kopyasını almak için, öğeyi aldığımda

public Item(Item otherItem){ 
    variable1 = otherItem.variable1; 
    variable2 = otherItem.variable2; 
    ... 
} 

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

Sonra Item bir kopya kurucu ve daha sonra bir klon yöntemi oluşturabilirsiniz

biri, klon oluşturmak gerekecek o

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);` 
+0

Bunun için daha iyi bir yol, bir kopya oluşturucu kullanmak olacaktır. 'public Item (Öğe clone) { this.variable1 = clone.variable1; this.variable2 = clone.variable2; } – ScoobyDrew18

+0

not edildi ve değiştirildi. – spectacularbob

+0

Yani bu öğe dosyasının bir parçası değil mi? Her özelliği kopyalamak zorunda mıyım? – Findas

0

Temel olarak yaptığınız şey bir histogramdır. LINQ, bunu yapan GroupBy() adlı yerleşik bir yönteme sahiptir.

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 

    } 
}