是否有任何现有的linq函数或类似的函数来检测有序列表中的值从小于零变为大于零的频率?
例如,值:
5
2
-2
-5
8 <--- First
6
2
0
1
-3
-5
-3
2 <--- Second
总数:2
答案 0 :(得分:3)
当然 - 使用Zip
使用.NET 4或更高版本当然很容易:
// 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的情况下“手动”轻松地完成它:
int count = 0;
for (int i = 0; i < list.Count - 1; i++)
{
if (list[i] > 0 && list[i + 1] < 0)
{
count++;
}
}
答案 1 :(得分:1)
您可以使用Aggregate
:
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可能更容易,因为它更传统。它也会更快:
var count = 0;
var lastN = 0;
foreach(var n in seq) {
if(n > 0 && lastN < 0)
count++;
if (n != 0)
lastN = n;
}