2012-06-27 39 views
0

我有一組三個double值作爲LINQ查詢中匿名錶達式的一部分。它看起來是這樣的:如何從C#4.0中的匿名錶達式集中獲取最小值

from item in collection where 
    Min(val1-val2, item.Property1, somethingElse) > item.Property2 
    select item; 

如何獲得最小括號中的表達式? Math.Min只接受兩個參數。我應該只使用匿名List.Min()嗎?有更好的方法嗎?

+0

是否所有val1-val2,獨立於集合的東西?如果是這樣,你只需要計算一次表達式。 – Vlad

+0

對不起,本來應該更重要。他們實際上都依賴於物品。但很好的問題。 –

回答

2
var items = collection 
    .Where(i => new[] { val1 - val2, item.Property1, somethingElse }.Min() > i.Property2) 

或者你可以只使用兩次MinMin(val1 - val2, Min(item.Property1, somethingElse))。如果val1 - val2somethingElse是恆定的,那麼您可以將它移動到Where子句之外,這也會使事情變得更簡單。

double min = Min(val1 - val2, somethingElse); 
var items = collection.Where(i => Min(min, item.Property1) > i.Property2) 
0

你當然可以在下述方式使用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; 
1

如果val1 - val2somethingElse不依賴於item,你可以做一個簡單的一招:

var tempMin = Math.Min(val1-val2, somethingElse); 
from item in collection where 
    Math.Min(item.Property1, tempMin) > item.Property2 
    select item; 

否則,您可以用

去0
from item in collection where 
    Math.Min(item.Property1, Math.Min(val1-val2, somethingElse)) > item.Property2 
    select item; 

如果要比較的項目數量可能很大或未預先知道,可以使用Lee的版本。

相關問題