计算一系列中的超出次数

发布于 2024-10-30 14:52:04 字数 372 浏览 1 评论 0原文

我在 IEnumrable 中有一系列数据。

设虚拟数据为:

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})。

我可以通过迭代每个成员并在每次超出值上升或下降时保持计数来做到这一点。

我想知道是否有任何方法可以使用 LINQ 查询来做到这一点。

I have a series data in IEnumrable<double>.

Let the dummy data be:

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

let my value of Exceedence be 1.5, so I want to count the number of time my value in series goes above 1.5 (basically number of times 1.5 constant line cut the graph). In above case it will be 3 ({1.6-2.51}, {2.52-4.5}, {2.53-3.5}).

I can do this by iterating through each member and keeping the count everytime it goes up or down the Exceedence value.

I am wondering is there any way to do this using LINQ query.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

相权↑美人 2024-11-06 14:52:04

这就是你想要的吗?

        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;
        });

Is that what you want?

        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;
        });
软糯酥胸 2024-11-06 14:52:04

您可以使用此辅助函数,它将为您提供超出限制的所有范围

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 ),还允许您查看这些范围的值。

您的特定示例的结果如下所示:

在此处输入图像描述

You could use this helper function that will give you all of the ranges above your limit

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);
    }
}

You'd then be able to use it like this:

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

This would then allow you to not only get the count of how many ranges are above your limit (3) but also allow you to look at the values of those ranges.

The results for your specific example look like this:

enter image description here

离线来电— 2024-11-06 14:52:04

这可能不是最好的方法,但这是使用 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();

This is probably not the best way of doing it, but it's a sneaky way of doing it with 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();
毅然前行 2024-11-06 14:52:04

只是为了好玩 - 使用 Jon Skeet“SelectPairs”扩展方法(link):

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

但是如果列表中只有一个值,则此方法不起作用。

PS DoctaJonez 回答 FTW! :)

Just for fun - the same result, using Jon Skeet "SelectPairs" extension method (link):

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

But this doesn't work if there is only one value in the list.

P.S. DoctaJonez answer FTW! :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文