如何检测列表中6个连续递减值并设置ChartData对象颜色?
解决连续6个递减ChartVal的ChartData着色问题
需求说明
遍历ChartData列表,将所有属于连续6个及以上ChartVal严格递减的元素的ChartColour设为Red,其余元素设为Black。例如输入序列[10,9,8,7,6,5,5,6,7,8],前6个递减元素全部标红,剩余元素标黑。
核心思路
不能边遍历边直接判定当前元素的颜色,因为需要确认后续元素是否能凑够连续6个递减值。因此分两步处理:
- 先遍历一次数据,标记出所有长度≥6的连续递减序列的起止索引区间
- 根据标记的区间,为对应元素设置颜色,其余元素设为默认黑色
完整代码实现
public class ChartData { public int ChartVal { get; set; } public string ChartColour { get; set; } // 其他属性 } // 获取原始数据 var rawData = _myDataService.GetChartData(); var chartDataList = rawData.Select(d => new ChartData { ChartVal = d.Value }).ToList(); // 第一步:识别所有符合条件的连续递减序列区间 var validRedIntervals = new List<(int StartIndex, int EndIndex)>(); int currentSequenceStart = 0; for (int i = 1; i < chartDataList.Count; i++) { // 检查当前值是否严格小于前一个值(保持递减) if (chartDataList[i].ChartVal < chartDataList[i - 1].ChartVal) { continue; } // 序列中断,检查当前序列长度是否达标 int sequenceLength = i - currentSequenceStart; if (sequenceLength >= 6) { validRedIntervals.Add((currentSequenceStart, i - 1)); } // 更新新序列的起始索引 currentSequenceStart = i; } // 检查最后一个未处理的序列 int lastSequenceLength = chartDataList.Count - currentSequenceStart; if (lastSequenceLength >= 6) { validRedIntervals.Add((currentSequenceStart, chartDataList.Count - 1)); } // 第二步:为元素设置颜色 // 先标记所有符合条件的元素为红色 foreach (var interval in validRedIntervals) { for (int i = interval.StartIndex; i <= interval.EndIndex; i++) { chartDataList[i].ChartColour = "Red"; } } // 剩余未标记的元素设为黑色 foreach (var item in chartDataList) { if (string.IsNullOrWhiteSpace(item.ChartColour)) { item.ChartColour = "Black"; } } // 最终用于图表的数据集 IList<ChartData> dataForChart = chartDataList;
关键细节说明
- 严格递减判定:代码中使用
chartDataList[i].ChartVal < chartDataList[i - 1].ChartVal,如果需求允许非严格递减(即允许相等),只需将<改为<=即可。 - 多序列处理:如果存在多个长度≥6的递减序列,代码会自动识别所有符合条件的区间并标记红色。
- 边界处理:循环结束后额外检查最后一个序列,避免遗漏末尾的有效递减序列。
内容的提问来源于stack exchange,提问作者tcode
相关产品推荐
相关产品推荐

