如何从C#4.0中的匿名表达式集获取最小值

如何从C#4.0中的匿名表达式集获取最小值,c#,c#-4.0,C#,C# 4.0,作为LINQ查询中匿名表达式的一部分,我有一组三个double值。它看起来像这样: from item in collection where Min(val1-val2, item.Property1, somethingElse) > item.Property2 select item; 如何获得括号中表达式的最小值?Min只接受两个参数。我应该使用匿名列表.Min()吗?有更好的方法吗 var items = collection .Where(i =

作为LINQ查询中匿名表达式的一部分,我有一组三个
double
值。它看起来像这样:

from item in collection where
     Min(val1-val2, item.Property1, somethingElse) > item.Property2
     select item;
如何获得括号中表达式的最小值?Min只接受两个参数。我应该使用匿名列表.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
两次,即
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;
但是,这将导致为
集合
中的每个
实例化一个新数组。就性能而言,这可能不是最好的方法。最好编写一个简单的方法来获得三个值中的最小值:

public double Min(double a, double b, double c)
{
    double result = a;

    if (result < b)
    {
       result = b;
    }

    if (result < c)
    {
       result = c;
    }

    return result;
}

您当然可以通过以下方式使用
Min
扩展方法:

from item in collection where
(new[] { val1-val2, item.Property1, somethingElse }.Min()) > item.Property2
select 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;
}

如果
val1-val2
somethingElse
不依赖于
,您可以执行一个简单的技巧:

var tempMin = Math.Min(val1-val2, somethingElse);
from item in collection where
     Math.Min(item.Property1, tempMin) > item.Property2
     select item;
否则,你可以和我一起去

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

如果要比较的项目数量可能很大或事先不知道,您可以使用Lee的版本。

如果
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;
否则,你可以和我一起去

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

如果要比较的项目数量可能很大或事先不知道,您可以选择Lee的版本。

是否所有的val1-val2都是独立于该系列的?如果是这样,您只需要计算表达式一次。对不起,应该更切题一点。它们实际上都依赖于项目。但好问题。所有的val1-val2都是独立于该系列的吗?如果是这样,您只需要计算表达式一次。对不起,应该更切题一点。它们实际上都依赖于项目。但这是个好问题。