2010-11-19 12 views
0

我需要一些帮助lamda表达式来获取值的一个子集范围。我有一个较低和较高的价值,让它们之间的一切似乎都很容易,但我还需要包含下一个更高和更高的价值。我可以单独做这些事情,但如果可能的话,希望一次完成。vb.net lamba表达式,选择所有值之间的低值和高值加上下一个较低和较高的值

我需要的子集的范围有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

+0

更多信息和样本数据将会有所帮助。 *下一个*上限值和下限值是否依次跟随上限值和下限值?您是否提供这些值用于过滤期间,还是应该让代码知道?给我们一些示例数据并告诉我们预期的输出。 – 2010-11-19 17:02:07

回答

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

在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 * log 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个值的优化根本就没有关系。