如何不使用Reverse方法从数组末尾开始隔位选取元素?
不用Reverse实现从数组末尾隔位选取元素
当然有不用Reverse方法的解决方案!核心思路是直接计算出从末尾开始隔位选对应的元素索引,不用反转数组就能直接筛选出目标元素~
先明确需求对应的索引
你的数组{3, 6, 1, 5, 5, 6}长度为6,索引范围是0~5。从最后一个元素(索引5)开始隔位选,需要提取的是索引5、3、1对应的元素,也就是6, 5, 6。
用LINQ的Where直接筛选
我们可以通过判断当前索引到最后一个索引的差值是否为偶数来筛选元素:
- 最后一个索引是
digitList.Length - 1(也就是5) - 对于每个元素的索引
i,计算digitList.Length - 1 - i:这个值代表当前元素到数组末尾的“步数” - 当这个步数是偶数时(0、2、4...),就说明该元素是我们要从末尾开始隔位选的目标
对应的代码如下:
int[] digitList = {3, 6, 1, 5, 5, 6}; var result = digitList.Where((x, i) => (digitList.Length - 1 - i) % 2 == 0).ToList(); // 结果:[6, 5, 6]
另一种更直观的写法(先选索引再取元素)
如果你想把“筛选索引”和“提取元素”的逻辑分开,也可以先生成符合条件的索引序列,再根据索引取元素:
var result = Enumerable.Range(0, digitList.Length) .Where(idx => (digitList.Length - 1 - idx) % 2 == 0) .Select(idx => digitList[idx]) .ToList();
这段代码的效果和上面完全一致,只是把步骤拆解开了,可读性更强。
为什么你原来的代码会出错?
你之前写的digitList.Where((x, i) => i % 2 == 0)是从数组开头开始隔位选偶数索引(0、2、4),对应的元素自然是3, 1, 5,和你要的“从末尾开始选”的逻辑完全相反,所以结果不对。
内容的提问来源于stack exchange,提问作者Linda Lawton - DaImTo
相关产品推荐
相关产品推荐

