0

doubleLINQクエリの匿名式の一部として3つの値のセットがあります。これは次のようになります。

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

括弧内の式の最小値を取得するにはどうすればよいですか?Math.Minは2つの引数のみを受け入れます。匿名のList.Min()を使用する必要がありますか?より良いアプローチはありますか?

4

3 に答える 3

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

Minまたは、 2回だけ使用することもできます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)
于 2012-06-27T19:35:11.923 に答える
1

に依存していないval1 - val2場合は、簡単なトリックを実行できます。somethingElseitem

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;

比較するアイテムの数が潜在的に多いか、事前にわからない場合は、リーのバージョンを使用できます。

于 2012-06-27T19:41:57.127 に答える
0

あなたは確かMinに次の方法で拡張メソッドを使うことができます:

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

ただし、これにより、のそれぞれに対して新しい配列がインスタンス化されitemますcollection。これは、パフォーマンスの面で最善のアプローチではない可能性があります。最小の3つの値を取得するための単純なメソッドを作成することをお勧めします。

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;
于 2012-06-27T19:39:26.033 に答える