You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中在List<double>里查找股票折线图峰值点的技术问询

修复股票折线图峰值查找的代码问题

嘿,我看了你这段查找峰值的代码,发现两个关键问题得先修正:


问题1:索引越界异常

你的循环从i=0开始,这时候访问list[i-1]就是访问list[-1],直接会抛出索引越界错误——毕竟第一个元素根本没有左边的邻居。所以循环的起始索引得从1开始,同时要保证i的右边还有元素,循环结束条件要设为i < list.Count - 1(这样i+1才不会超出集合的最大索引)。

问题2:峰值判断逻辑搞反了

你写的list[i] > list[i-1] && list[i] < list[i+1],这是在找谷值(比左右都低的点),而不是峰值!峰值的判断逻辑应该是当前点比左右两个相邻点都大,条件要改成list[i] > list[i-1] && list[i] > list[i+1]。


修正后的基础版代码

先解决核心问题,得到能正确查找中间峰值的代码:

List<double> peak = new List<double>();
// 从第2个元素(索引1)开始,到倒数第2个元素(索引list.Count-2)结束
for (int i = 1; i < list.Count - 1; i++)
{
    // 正确的峰值判断:当前点大于左右邻居
    if (list[i] > list[i - 1] && list[i] > list[i + 1])
    {
        peak.Add(list[i]);
    }
}

进阶:包含边界点的峰值处理

如果你的股票折线图需要把边界点也算作峰值(比如开盘价直接是当天最高点,或者收盘价是最后时段的最高点),可以单独处理首尾两个点:

List<double> peak = new List<double>();

// 处理第一个点:只有一个元素时直接算作峰值,否则比第二个点大才算
if (list.Count == 1)
{
    peak.Add(list[0]);
}
else if (list.Count > 1 && list[0] > list[1])
{
    peak.Add(list[0]);
}

// 处理中间的峰值点
for (int i = 1; i < list.Count - 1; i++)
{
    if (list[i] > list[i - 1] && list[i] > list[i + 1])
    {
        peak.Add(list[i]);
    }
}

// 处理最后一个点:比倒数第二个点大才算峰值
if (list.Count > 1 && list[list.Count - 1] > list[list.Count - 2])
{
    peak.Add(list[list.Count - 1]);
}

这样就能覆盖所有可能的峰值情况啦,不管是中间的最高点,还是首尾的边界峰值都能准确找出来。

内容的提问来源于stack exchange,提问作者Khew Sei Fan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:31:11