vb.net lamba выражение для выбора всех значений между нижним и верхним значениями плюс следующее нижнее и верхнее значения - PullRequest
0 голосов
/ 19 ноября 2010

Мне нужна помощь с лямда-выражением, чтобы получить подмножество диапазона значений. У меня есть нижнее и верхнее значения, и все между ними кажется достаточно простым, но мне также нужно включить следующее более низкое и высокое значения. Я могу сделать каждый из них отдельно, но хотел бы сделать это одним выстрелом, если это возможно.

Диапазон, из которого мне нужно подмножество, имеет 150 значений. Небольшой пример будет выглядеть так: {8.206,8.206,8.201,8.196,8.193,8.192,8.189,8.174,8.171,8.171,8.166,8.163,8.157,8.154,8.153,8.14,8.131}

Мое нижнее значение: 8,16 Мое верхнее значение: 8,17

Мне нужно вернуться: {8.171,8.171,8.166,8.163,8.157}

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Я закончил тем, что сделал что-то вроде этого:

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 голосов
/ 24 ноября 2010

В C #, но есть аналогичный VB-эквивалент.Примерно так должно работать (не проверено) :

...

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 * logn) время для значений диапазона выше и ниже.Это в отличие от чего-то подобного:

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 значений оптимизация вообще не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...