计算一系列的超过数量

时间:2011-04-07 10:41:04

标签: c# linq

我在IEnumrable<double>中有一系列数据。

让虚拟数据为:

0
0
0
1
1.6
2.5
3.5
2.51
1.0
0
0
0
2.52
3.5
6.5
4.5
1.2
1.0
2.53
3.5

让我的Exceedence值为1.5,所以我想计算我的系列值超过1.5的时间(基本上是1.5次常量线切割图的次数)。在上述情况下,它将是3({1.6-2.51},{2.52-4.5},{2.53-3.5})。

我可以通过迭代每个成员并在每次上升或下降Excedence值时保持计数来完成此操作。

我想知道有没有办法使用LINQ查询来做到这一点。

4 个答案:

答案 0 :(得分:5)

这就是你想要的吗?

        bool isAbove = false;
        int count = yourList.Count(x =>
        {
            if (x > 1.5 && !isAbove)
            {
                isAbove = true;
                return true;
            }
            else if (x < 1.5)
            {
                isAbove = false;
            }
            return false;
        });

答案 1 :(得分:1)

您可以使用此助手功能,它将为您提供超出限制的所有范围

public IEnumerable<IEnumerable<double>> GetRangesAboveLimit(IEnumerable<double> source, double limit)
{
    //keep going until we've processed the entire range
    while (source.Any())
    {
        //skip elements below the limit
        source = source.SkipWhile(e => e <= limit);
        //yield the elements above the limit
        yield return source.TakeWhile(e => e > limit);
        //now skip those elements and then continue
        source = source.SkipWhile(e => e > limit);
    }
}

然后你可以像这样使用它:

var range = new double [] { /* initialise here */ };
var rangesAboveLimit = GetRangesAboveLimit(range, 1.5);

这样,您不仅可以获得超出限制的范围(3),还可以查看这些范围的值。

您的具体示例的结果如下所示:

enter image description here

答案 2 :(得分:0)

只是为了好玩 - 同样的结果,使用Jon Skeet“SelectPairs”扩展方法(link):

yourList.SelectPairs((x,y) => (x < 1.5 && y > 1.5) ? 1 : 0).Sum()

但如果列表中只有一个值,则无效。

P.S。 DoctaJonez回答FTW! :)

答案 3 :(得分:0)

这可能不是最好的方法,但这是用LINQ做的一种偷偷摸摸的方式。

float[] numbers = { 0f, 0f, 0f, 1f, 1.6f, 2.5f, 3.5f, 2.51f, 1.0f, 0f, 0f, 0f, 2.52f, 3.5f, 6.5f, 4.5f, 1.2f, 1.0f, 2.53f, 3.5f };

int count = numbers.Where((n, i) => i > 0 && n > 1.5f && numbers[i - 1] < 1.5f).Count();