3回呼び出すこともできますSum
が、ループが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
、配列の割り当てが発生します。(そしてそれはまだ3つのループを実行します)
ただし、エントリの数が非常に多い場合や、このコードをタイトループで実行している場合を除いて、パフォーマンスについて心配する必要はありません。
編集:本当にLINQを使用したい場合は、次Aggregate
のように誤用する可能性があります。
int totalWeight, totalLength, items;
list.Aggregate((a, b) => {
weight += detail.GrossWeight;
length += detail.Length;
items += detail.NrDistaff;
return a;
});
これは驚くほど醜いコードですが、ストレートループとほぼ同じように実行されるはずです。
アキュムレータで合計することもできますが(以下の例を参照)、これにより、リスト内のすべてのアイテムに一時オブジェクトが割り当てられます。これはばかげた考えです。(匿名タイプは不変です)
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
}
);