[英]How can I use LINQ to get a property matching a conditional sum?
好的,標題聽起來很奇怪,但這是我的情況。 我認為這是一個簡單的查詢,但是很難在紙上解釋。 我自己在使用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
等於輸入數量的總和。
舉例說明:
使用上面的示例數據,我想找到與581
(從其他位置輸入的變量)總量相匹配的rate
。 列表中的前三個對象的總數量為582,因此我希望我的LINQ查詢返回0.14
(與總quantity
字段大於輸入數量的條件匹配的rate
)。
我應該能夠使用LINQ來做到這一點,對吧? 它有點像.Sum
和.Where
,這就是我感到困惑的地方。
有沒有參考資料可以解決這種情況? 有沒有人寫過“有條件的和”的經驗?
在函數式編程中,這將是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;
本來要Aggregate
但未能進入一行:(
對於單線的需求 ,這是LINQ
的有趣用法:)
var target = 581;
var sum = 0;
var rate = data.First(i =>(sum += i.Quantity) > target).Rate; // 0.14
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.