2010-11-19 13 views
0

値の範囲のサブセットを取得するには、lamda式で助けが必要です。私は低い値と高い値を持っており、それらの間のすべてを得ることは十分容易だと思われますが、次のより低い値と高い値を含める必要もあります。私はこれらのそれぞれを別々に行うことができますが、可能であればワンショットでやりたいと思います。vb.net lamba式を使用して、下位と上位の値に次の下位と上位の値を加えたものを選択します。

私はサブセットが必要な範囲は150の値を持っています。小さな例は次のようになります: {8.206,8.206,8.201,8.189,8.193,8.192,8.189,8.174,8.171,8.171,8.166,8.163,8.157,8.166,8.163,8.157,8.166,8.153,8.14,8.131}

私のより低い値である:8.16 私の上限値である:C#では{8.171,8.171,8.166,8.163,8.157}

+0

詳細情報とサンプルデータが役立ちます。 * next *の値が上下の値に続いていますか?ろ過の際にこれらの値を提供していますか?いくつかのサンプルデータを与え、どのような出力が期待されるかを教えてください。 –

答えて

0

私はこのような何かやってしまった:

Dim myData As New List(Of someData) 
myData = sorceData.Where(Function(i) i.somevalue >= myLowervalue And i.somevalue <= myUpperValue).ToList 
myData = myData.Concat(sorceData.Where(Function(i) i.somevalue > myUpperValue).Take(1).ToList).ToList 
myData = myData.Concat(sorceData.Where(Function(i) i.somevalue < myLowervalue).Take(1).ToList).ToList 

それは単一の式ではないのですが、それは動作しますが。

0

も同様VB当量が存在する:8.17

Iを取り戻す必要があります。このような何かが(未テスト)動作するはずです:

...

enum RangeRelation {Below, InRange, Above}; 

を...

mySetOfNumbers  
.Select(number => 
    new { 
    Number = number, 
    RangeRelation = 
      number < lowerBound ? RangeRelation.Below : 
      number > upperBound ? RangeRelation.Above : 
      RangeRelation.InRange 
    }) 
    .GroupBy(x=>x.RangeRelation) 
    .SelectMany(group => 
    group.Key == RangeRelation.Below ? 
     (group.Any() ? new [] { group.OrderBy(x=>x).Last() } : new double[0]) : 
    group.Key == RangeRelation.Above ? 
     (group.Any() ? new [] { group.OrderBy(x=>x).First() } : new double[0]) : 
    group 
); 

結果は、これまで十分にあるかどうかをある程度疑問がある場合、それは大丈夫です遅れて実行されるとあなたの好きなところで動作するかもしれないので列挙されます。しかし、もしあなたが結果的に得られた値の全てを確実に使用しているなら、私はこれが効率的なものにコンパイルされるのではないかと疑います。

言うことです

は、GroupBy()は一度セットを通過しなければならない、新しいタイプを作成する必要があり、その後、OrderBy()は、上記の両方のためのO(N * Nログ)時間のようなものになるだろう範囲値の下にあります。これは、次のようなものとは対照的です。

double? above = null; 
double? below = null; 
var selected = new List<double>(); 
foreach(var number in mySetOfNumbers) 
    if(number < lowerBound && number > below??Double.MinValue) 
    below = number; 
    else if(number > upperBound && number < above??Double.MaxValue) 
    above = number; 
    else 
    selected.Add(number); 

if(above != null) selected.Add(above); 
if(below != null) selected.Add(below); 

return selected; 

これは、単一の列挙を必要とするだけです。

言い換えれば、150個の値の最適化は全く問題ではありません。

関連する問題