2017-08-25 2 views
1

Ich arbeite gerade an einer Anwendung in C#. Stellen Sie sich eine Ladenfront mit einer Kasse vor. Ich habe eine Wörterbuchstruktur mit einem Objekt als Schlüssel, und einen int Objektzähler als Wert.C# Dictionary Summe der Gruppenwerte berechnen

die Struktur sieht wie folgt aus:

Dictionary<myObject, int> items. 

Die Grundidee ist, ein Wörterbuch der Gegenstände in eine Methode zu übergeben. Ich füge nur einzigartige myObjects dem Wörterbuch hinzu. Das myObject hat eine Gegenregel beigefügt. Sobald die Zählerregel voll ist, möchte ich eine Berechnung mit allen myObects im Wörterbuch durchführen.

Die myObject sieht wie folgt aus:

public class myObject 
{ 
    string ItemId { get; set; } 
    Discount Discount { get; set; } 
} 

public class Discount 
{ 
    public int Count { get; set; } 
    public decimal Price { get; set; } 
    public IDiscountHandler DiscountHandler => new DiscountHandler(); 
} 

Eine Probe myObject könnte wie folgt aussehen:

var myObectA = new myObject() 
{ 
    ItemId = "A" 
}; 

var discountA = new Discount() 
{ 
    Count = 2, 
    Price = 12 // special price, if 2 myObjects were added to the Dictionary 
}; 

myObjectA.Discount = discountA; 

1) ich die Einzelteile Wörterbuch ausfüllen und an die Handler-Methode übergeben:

private decimal _totalDiscountedValue { get; set; } = 0; 

    if (!_items.ContainsKey(myObject)) 
    { 
     _items.Add(myObject, 1); 
    } 
    else 
    { 
     _items[myObject]++; 
    } 

    _totalDiscountedValue += _discountHandler.CalculateDiscount(_items); 

2) In meinem Handler versuche ich alle Rabattwerte zusammenzufassen, sobald eine Zählerregel voll ist. Aber hier bin ich kämpfen leider:

public class DiscountHandler : DiscountHandler 
{ 
    private decimal _totalDiscount { get; set; } = 0; 

    public override decimal CalculateDiscount(IDictionary<myObject, int> items) 
    { 
     if (items == null) throw new ArgumentNullException(nameof(items)); 

     // I'm struggeling here: 
     // check if Dictionary[i].Dicount.Count = Dictionary.Value 
     // then _totalDiscount += Dictionary[i].Discount.Price 

     return _totalDiscount; 
    } 
} 

Sie wissen, wie dieses Problem zu lösen, oder haben Sie eine Idee, wie man dies möglicherweise zu lösen?

Vielen Dank !!

+0

_totalDiscountedValue = _totalDiscountedValue + _discountHandler.CalculateDiscount (_items); –

Antwort

3

funktionieren würde tun könnte Wörterbuch mit foreach nur durchlaufen wie folgt:

public override decimal CalculateDiscount(IDictionary<myObject, int> items) 
{ 
    if (items == null) throw new ArgumentNullException(nameof(items)); 

    foreach (var kvp in items) 
    { 
     if (kvp.Key.Discount.Count == kvp.Value) 
      _totalDiscount += kvp.Key.Discount.Price; 
    } 
    return _totalDiscount; 
} 
+0

Ich bevorzuge diese Antwort aufgrund der Verwendung der Schutzklausel –

+0

Stört es Sie zu erklären, was Sie mit "Wächterklausel" meinen? Wie unterscheidet sich diese Antwort von meiner? – Wndrr

0

, wenn ich das Problem richtig verstanden, vielleicht diese

Sie
foreach (var item in items) 
{ 
    if (item.Key.Discount.Count == item.Value) 
     _totalDiscount += item.Key.Discount.Price; 
} 

return __totalDiscount; 
+0

'Key.Docount' sollte' Key.Discount' sein, OP hat den gleichen Tippfehler, und zum Überprüfen der Gleichheit in einer if-Anweisung verwenden Sie '==' anstelle von '='. Syntax! ;) –

+0

oh, mein Schlechter! Ich sollte meinen Code definitiv testen, bevor ich eine Antwort gebe, dass '=' schlecht ist! Danke <3 – Wndrr

1

Mit Linq

//check if yourDictonary is not null 
var sum = yourDictonary.Select(x => x.Key.Discount.Count == x.Value).Sum(x => x.Value) 
+0

Schöne Verwendung von Linq! Ich wusste nichts von der Summenmethode, danke dafür :-) – Wndrr

+0

danke für den upvote ;-) – Winnie