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

C#中根据起止值从固定List<int>返回指定子列表的实现问题

解决方案:实现循环截取固定列表的子列表

问题分析

你需要从固定列表 List<int> values = new List<int>() {0, 1, 2, 3, 4, 5, 6} 中,根据输入的startValue和endValue返回连续(支持循环跨列表首尾)的子列表。原代码使用Except方法完全错误——Except用于计算两个集合的差集,会移除指定元素,和截取区间的需求完全不符。

正确实现(LINQ版本)

根据startValue和endValue的大小关系分两种情况处理:

  • 当startValue <= endValue时,直接截取从startValue到endValue的连续元素
  • 当startValue > endValue时,先截取从startValue到列表末尾的元素,再拼接从列表开头到endValue的元素

代码示例:

// 固定列表
private static readonly List<int> Values = new List<int>() {0, 1, 2, 3, 4, 5, 6};

public List<int> GetTargetSubList(int startValue, int endValue)
{
    if (startValue <= endValue)
    {
        // 截取从start到end的连续元素(包含两端)
        return Values.Skip(startValue).Take(endValue - startValue + 1).ToList();
    }
    else
    {
        // 拼接两部分:start到末尾,开头到end
        var partFromStartToEnd = Values.Skip(startValue);
        var partFromBeginToEnd = Values.Take(endValue + 1);
        return partFromStartToEnd.Concat(partFromBeginToEnd).ToList();
    }
}

验证示例

  • 示例#1:startValue=0,endValue=4
    Skip(0)取全部元素,Take(5)(4-0+1=5)得到{0,1,2,3,4},符合预期。
  • 示例#2:startValue=1,endValue=6
    Skip(1)取1-6,Take(6)(6-1+1=6)得到{1,2,3,4,5,6},符合预期。
  • 示例#3:startValue=6,endValue=4
    Skip(6)得到{6},Take(5)(4+1=5)得到{0,1,2,3,4},拼接后得到{6,0,1,2,3,4},符合预期。

补充说明

当前固定列表的元素值和索引完全对应(元素n的索引就是n),所以可以直接用元素值作为Skip和Take的参数。如果后续列表结构变化、元素和索引不对应,需要先通过Values.IndexOf(startValue)获取索引后再进行截取。

内容的提问来源于stack exchange,提问作者Saleh Sayeem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:10:27