您可以使用查詢語法在一個語句中使用let
關鍵字執行此操作。它只評估一次「最大」,所以它就像三個單獨的陳述一樣,只有一行。
var anonymousObjList = from o in ObjectTable
where o.Category == "Y"
let max = ObjectTable.Max(m => m.Value)
select new { o, IsMax = (o.Value == max) };
這是我唯一使用查詢語法的時間。你不能使用方法語法來做到這一點!
編輯:ReSharper的建議
var anonymousObjList = ObjectTable.Where(o => o.Category == "Y")
.Select(o => new {o, max = ObjectTable.Max(m => m.Value)})
.Select(@t => new {@t.o, IsMax = (@t.o.Value == @t.max)});
然而這並不是最佳選擇。第一個Select將爲ObjectTable中的每個項目投影max
屬性 - 將爲每個項目評估Max函數。如果您使用查詢語法,則只會評估一次。
再次,你只能用查詢語法來做到這一點。我不是查詢語法的粉絲,但這使得它值得,而且是我使用它的唯一情況。 ReSharper錯了。
我不認爲有一種方法可以將它變成單個查詢。另外,可能沒有任何理由這麼做(你可以做的唯一事情就是在第一個數據加載時使用'IEnumerable'慢數據源加載'ToList')。 –
當你需要他時,Jon Skeet在哪裏? –