あなたはSum
3回呼び出すことができますが、それは3つのループを行いますので、それが遅くなります。例えば
:それはあなたのケースでは、このような問題ではないのですが、
var list = ArticleLedgerEntries.Where(pd => pd.LedgerEntryType == LedgerEntryTypeTypes.Unload
&& pd.InventoryType == InventoryTypes.Finished))
var totalWeight = list.Sum(pd => pd.GrossWeight);
var totalLength = list.Sum(pd => pd.Length);
var items = list.Sum(pd => pd.NrDistaff);
ため、遅延実行のために、それはまた、Where
コールするたびに再評価されます。これはToArray
を呼び出すことで回避できますが、それは配列の割り当てを引き起こします。
ただし、非常に多数のエントリがある場合や、タイトループでこのコードを実行している場合を除き、パフォーマンスについて心配する必要はありません。
EDIT:
int totalWeight, totalLength, items;
list.Aggregate((a, b) => {
weight += detail.GrossWeight;
length += detail.Length;
items += detail.NrDistaff;
return a;
});
これは驚異的に醜いコードですが、ほとんどと同様に実行する必要があります。あなた本当にはこのように、あなたがAggregate
を誤用でき、LINQを使用したい場合ストレートループ。
また、(以下の例を参照)、アキュムレータにまとめることができますが、これはダムアイデアですあなたのリスト内のすべての項目のための一時的なオブジェクトを割り当てます。 (匿名型は不変です)あなたは、このトピックで答えを使って、このピボットスタイルを行うことができると思います
var totals = list.Aggregate(
new { Weight = 0, Length = 0, Items = 0},
(t, pd) => new {
Weight = t.Weight + pd.GrossWeight,
Length = t.Length + pd.Length,
Items = t.Items + pd.NrDistaff
}
);
LINQがbe-すべてのエンドすべてのデータ操作のではなく、ループのためには何の問題もまだありません。 – SLaks
これは、LINQが妥当な解決法を提供していないまれなケースの1つです@SLaks。 – PeterX