2017-03-05 6 views
0

Ich habe zwei Listen und muss einen Eigenschaftswert aller Elemente in der ersten Liste mit einem Eigenschaftswertdurchschnitt aller übereinstimmenden Elemente in aktualisieren eine andere Liste.Aktualisieren von Eigenschaftswerten in einer Liste mit einem Eigenschaftswertdurchschnitt von übereinstimmenden Elementen in einer anderen Liste

class transaction 
{ 
    public string orderId; 
    public string parentOrderId; 
    public int quantity; 
    public decimal marketPrice; 
    public decimal fillPrice; 
} 

List<transaction> makerTransactions = new List<transaction>() 
{ 
    new transaction(){ 
        orderId = "1", 
        parentOrderId = "1", 
        quantity = 100, 
        marketPrice = 75.87M, 
        fillPrice = 75.87M 
        } 
}; 

List<transaction> takerTransactions = new List<transaction>() 
{ 
    new transaction(){ 
        orderId = "2", 
        parentOrderId = "1", 
        quantity = 50, 
        marketPrice = 75.97M, 
        fillPrice = 75.97M 
        }, 
    new transaction(){ 
        orderId = "3", 
        parentOrderId = "1", 
        quantity = 50, 
        marketPrice = 75.85M, 
        fillPrice = 75.85M 
        } 
}; 

Der Versuch, diese Arbeit mit LINQ-Erweiterungsmethoden zu machen, aber kann nicht der richtige Weg herauszufinden.

makerTransactions.All(mt => mt.fillPrice = takerTransactions 
       .Where(tt => tt.parentOrderId == mt.orderId) 
       .Average(ta => ta.fillPrice)); 

Antwort

2

try this:

makerTransactions.ForEach(mt => mt.fillPrice = takerTransactions 
    .Where(tt => tt.parentOrderId == mt.orderId) 
    .Average(ta => ta.fillPrice)); 

All ist eine Erweiterung Methode. Es teilt Ihnen mit, ob alle Elemente in einer Sammlung mit einer bestimmten Bedingung übereinstimmen, und offensichtlich ist es nicht das, was Sie brauchen.

Um es effizienter, zuerst ein Wörterbuch erstellen und dass die Mittelwerte von zu nehmen und benutzen

var priceDictionary = takerTransactions 
    .GroupBy(tt => tt.parentOrderId) 
    .ToDictionary(grp => gr.Key, grp => grp.Average(ta => ta.fillPrice)); 

makerTransactions.ForEach(mt => mt.fillPrice = priceDictionary[mt.orderId]); 
+2

ich zuerst ein Wörterbuch von 'orderId' (key) und' average' (Wert) schaffen würde (Verwenden einer LINQ-Anweisung und 'ToDictionary'). Es ist ziemlich teuer, den Durchschnitt für jede Iteration zu berechnen. –

+0

@GertArnold Ja, du hast Recht. danke –

+0

@GertArnold Können Sie bitte Ihren Vorschlag etwas ausführlicher erklären? Ich muss immer noch alle Elemente in der ersten Liste durchlaufen, nach übereinstimmenden Datensätzen in der zweiten Liste suchen und die Übereinstimmungen mitteln. – ddrjca

Verwandte Themen