将带索引参数的LINQ Where方法改写为非LINQ实现,修复输出大量零问题
原LINQ代码逻辑说明
你提供的LINQ版本代码:
playerhand[i] = numbers[0]; numbers = numbers.Where((source, index) => index != 0).ToArray();
实际实现两个功能:
- 将
numbers数组的首个元素赋值给playerhand[i] - 生成一个长度比原
numbers数组小1的新数组,新数组包含原数组除索引0以外的所有元素,等价于移除原数组的第一个元素。
现有代码的问题
- 逻辑匹配错误:原代码是按索引位置过滤元素,你编写的代码是按值匹配将所有和首个元素值相等的元素置为0,两者功能完全不符
- 未调整数组长度:原LINQ执行后
numbers数组长度会减1,你的代码仍使用原长度的数组,仅修改部分元素值为0,自然会输出大量多余的0 - 循环边界设置错误:你使用的
75 - i循环边界和原逻辑没有关联,会导致元素遍历不全或者数组越界。
修正后的非LINQ实现
通过创建新数组、复制除首元素外的所有内容即可实现等价效果:
playerhand[i] = numbers[0]; // 初始化长度少1的新数组 int[] newNumbers = new int[numbers.Length - 1]; // 从原数组索引1开始复制所有元素到新数组 for (int n = 1; n < numbers.Length; n++) { newNumbers[n - 1] = numbers[n]; } numbers = newNumbers;
内容的提问来源于stack exchange,提问作者Tin A
相关产品推荐
相关产品推荐

