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=4Skip(0)取全部元素,Take(5)(4-0+1=5)得到{0,1,2,3,4},符合预期。 - 示例#2:
startValue=1,endValue=6Skip(1)取1-6,Take(6)(6-1+1=6)得到{1,2,3,4,5,6},符合预期。 - 示例#3:
startValue=6,endValue=4Skip(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
相关产品推荐
相关产品推荐

