首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列表:检测从小于零到大于零的开关

列表:检测从小于零到大于零的开关
EN

Stack Overflow用户
提问于 2013-02-21 22:56:55
回答 2查看 161关注 0票数 0

是否有任何现有的linq函数或类似的函数来检测有序列表中的值从小于零到大于零的频率?

例如,值:

代码语言:javascript
运行
复制
5
2
-2
-5
8  <--- First
6
2
0
1
-3
-5
-3
2  <--- Second

总数:2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-21 23:04:46

当然-如果您使用的是.NET 4或更高版本,使用Zip,这当然很简单

代码语言:javascript
运行
复制
// TODO: Consider how you want to handle 0 itself
var count = list.Zip(list.Skip(1), (x, y) => new { x, y })
                .Count(pair => pair.x > 0 && pair.y < 0);

如果你很了解VB,这应该不难转换成VB :)

或者,如果你真的有一个列表,你可以在没有LINQ的情况下很容易地“手动”完成它:

代码语言:javascript
运行
复制
int count = 0;
for (int i = 0; i < list.Count - 1; i++)
{
    if (list[i] > 0 && list[i + 1] < 0)
    {
        count++;
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-02-21 23:52:49

您可以使用Aggregate一次性实现这一点

代码语言:javascript
运行
复制
seq.Aggregate(new { Count=0, LastN = 0}, (state, n) => new { 
        Count =  state.Count + (n > 0 && state.LastN < 0 ? 1 : 0), 
        LastN = n == 0 ? state.LastN : n
    }).Count

这考虑到您希望包含“渐进式”转换,如-1,0,1。

然而,foreach可能更容易,因为它更传统。它也会更快:

代码语言:javascript
运行
复制
var count = 0;
var lastN = 0;
foreach(var n in seq) {
    if(n > 0 && lastN < 0)
        count++;
    if (n != 0)
        lastN = n;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15005335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档