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

如何通过List的GetRange获取子列表并将操作结果同步至原列表?

解决List子列表修改同步到原列表的问题

你当前代码的问题在于List<T>.GetRange方法返回的是原列表元素的副本列表——因为int是值类型,新列表里的每个元素都是原列表对应位置元素的独立拷贝,所以修改subNumbers里的元素不会影响原列表myNumber。

方案1:直接操作原列表的目标索引范围

最直接的方式就是跳过创建子列表,直接遍历原列表中需要修改的索引区间,直接修改原元素:

var myNumber = new List<int>() { 1, 5, 9, 7, 2, 8, 2 };
int startIndex = 2;
int count = 4;

// 遍历原列表的目标范围,直接修改元素
for (int i = startIndex; i < startIndex + count; i++)
{
    myNumber[i] = (int)Math.Pow(myNumber[i], 2);
}

Console.WriteLine(string.Join(", ", myNumber)); // 输出: 1, 5, 81, 49, 4, 64, 2

方案2:使用Span获取原内存段(无副本)

如果你需要保留“子列表”的操作方式,可以用Span<T>来直接引用原列表的内存区域,这样修改Span中的元素会直接同步到原列表:

var myNumber = new List<int>() { 1, 5, 9, 7, 2, 8, 2 };
// AsSpan直接指向原列表的内部数组,无元素拷贝
Span<int> subNumbers = myNumber.AsSpan(2, 4);

for (int i = 0; i < subNumbers.Length; i++)
{
    subNumbers[i] = (int)Math.Pow(subNumbers[i], 2);
}

Console.WriteLine(string.Join(", ", myNumber)); // 输出: 1, 5, 81, 49, 4, 64, 2

原代码失效的核心原因

GetRange方法会创建一个全新的List<int>,并把原列表中指定范围的int值逐个复制到新列表里。由于int是值类型,每个拷贝都是独立的,修改新列表里的值完全不会影响原列表的元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:47:43