順序付きリストの値がゼロ未満からゼロより大きいまで変化する頻度を検出するための既存のlinq関数または類似の関数はありますか?
例として、値:
5
2
-2
-5
8 <--- First
6
2
0
1
-3
-5
-3
2 <--- Second
総数:2
もちろん、.NET 4以降を使用している場合は、次を使用して簡単に実行できますZip
。
// 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回のパスで実装できます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;
}