如何从C#4.0中的匿名表达式集获取最小值
作为LINQ查询中匿名表达式的一部分,我有一组三个如何从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 =
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都是独立于该系列的吗?如果是这样,您只需要计算表达式一次。对不起,应该更切题一点。它们实际上都依赖于项目。但这是个好问题。