如何使用LINQ获取匹配条件求和的属性?

时间:2018-01-04 17:51:23

标签: c# linq

好吧,我觉得标题听起来很奇怪,但这是我的情景。我认为这是一个简单的查询,但很难在纸上解释。我自己也遇到了LINQ问题。最好通过例子来解释:

我有一个对象列表(在psuedocode中),如下所示:

var data = [
  {
    quantity: 123,
    rate: 0.12
  },
  {
    quantity: 456,
    rate: 0.13
  },
  {
    quantity: 3,
    rate: 0.14
  },
  {
    quantity: 92,
    rate: 0.15
  }
]

我正在尝试生成 LINQ 查询,该查询返回rate等于输入数量的总和。

通过示例解释:

使用上面的示例数据,我想找到匹配总数rate的{​​{1}}(来自其他地方的变量输入)。我列表中的前三个对象的数量总共为582,所以我希望我的LINQ查询返回5810.14匹配总rate个字段大于我输入的条件数量)。

我应该可以使用LINQ来做到这一点,对吧?它有点quantity.Sum,这就是我感到困惑的地方。

是否有任何参考可以解决这种情况? 有没有人有写“条件总和”的经验?

2 个答案:

答案 0 :(得分:4)

在函数式编程中,这将是reduce的变体。在LINQ中,Aggregate方法可用于此目的。伪LINQ:

var limit = 581;
var rate = data.Aggregate((acc, cur) =>
{
    if (acc.quantity < limit)
    {
        return new
        {
            quantity = acc.quantity + cur.quantity,
            rate = cur.rate
        };
    }
    else
    {
        return acc;
    }
}).rate;

编辑:更紧凑的单行版本:

var rate = data.Aggregate((acc,cur) => acc.quantity < limit ? new { quantity = acc.quantity + cur.quantity, rate = cur.rate } : acc).rate;

答案 1 :(得分:1)

前往Aggregate但未能排成一行:(

对于所需的单行,这是LINQ的有趣用法:)

var target = 581;
var sum = 0;
var rate = data.First(i =>(sum += i.Quantity) > target).Rate; // 0.14