簡體   English   中英

如何使用LINQ獲得與條件總和匹配的屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM