我有一組三個double
值作爲LINQ查詢中匿名錶達式的一部分。它看起來是這樣的:如何從C#4.0中的匿名錶達式集中獲取最小值
from item in collection where
Min(val1-val2, item.Property1, somethingElse) > item.Property2
select item;
如何獲得最小括號中的表達式? Math.Min只接受兩個參數。我應該只使用匿名List.Min()嗎?有更好的方法嗎?
我有一組三個double
值作爲LINQ查詢中匿名錶達式的一部分。它看起來是這樣的:如何從C#4.0中的匿名錶達式集中獲取最小值
from item in collection where
Min(val1-val2, item.Property1, somethingElse) > item.Property2
select item;
如何獲得最小括號中的表達式? Math.Min只接受兩個參數。我應該只使用匿名List.Min()嗎?有更好的方法嗎?
var items = collection
.Where(i => new[] { val1 - val2, item.Property1, somethingElse }.Min() > i.Property2)
或者你可以只使用兩次Min
即Min(val1 - val2, Min(item.Property1, somethingElse))
。如果val1 - val2
和somethingElse
是恆定的,那麼您可以將它移動到Where
子句之外,這也會使事情變得更簡單。
double min = Min(val1 - val2, somethingElse);
var items = collection.Where(i => Min(min, item.Property1) > i.Property2)
你當然可以在下述方式使用Min
擴展方法:
from item in collection where
(new[] { val1-val2, item.Property1, somethingElse }.Min()) > item.Property2
select item;
然而,這將導致新的陣列中collection
被實例化每個item
。這可能不是最好的方法,在性能方面。這是更好的寫一個簡單的方法三個值來獲得最低:
public double Min(double a, double b, double c)
{
double result = a;
if (result < b)
{
result = b;
}
if (result < c)
{
result = c;
}
return result;
}
然後,您可以編寫以下查詢:
from item in collection where
Min(val1-val2, item.Property1, somethingElse) > item.Property2
select item;
如果val1 - val2
和somethingElse
不依賴於item
,你可以做一個簡單的一招:
var tempMin = Math.Min(val1-val2, somethingElse);
from item in collection where
Math.Min(item.Property1, tempMin) > item.Property2
select item;
否則,您可以用
去0from item in collection where
Math.Min(item.Property1, Math.Min(val1-val2, somethingElse)) > item.Property2
select item;
如果要比較的項目數量可能很大或未預先知道,可以使用Lee的版本。
是否所有val1-val2,獨立於集合的東西?如果是這樣,你只需要計算一次表達式。 – Vlad
對不起,本來應該更重要。他們實際上都依賴於物品。但很好的問題。 –