使用另一个列表中匹配项的属性值平均值更新一个列表中的属性值

时间:2017-03-05 16:17:21

标签: c# linq extension-methods

我有两个列表,需要使用另一个列表中所有匹配项的属性值平均值来更新第一个列表中所有项的属性值。

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

尝试使用LINQ扩展方法使其工作,但无法找出正确的方法。

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

1 个答案:

答案 0 :(得分:2)

试试这个:

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

所有都是一种扩展方法。它告诉你集合中的所有元素是否符合某个条件,显然,它不是你需要的。

为了提高效率,首先要创建一个字典并使用它来获取平均值:

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