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

C#中能否创建指向其他数组的合并数组?

在C#中实现联动更新的合并数组

首先明确:原生double[]是值类型的连续存储结构,直接合并会生成独立的新数组,修改原数组不会同步到合并后的数组。你代码里的arr1 + arr2写法不可行,因为C#数组没有重载加法运算符。

普通合并数组(无联动更新)

如果不需要原数组和合并数组的联动,只是单纯合并两个数组,可以用以下两种方式:

// 方式1:用LINQ的Concat方法
double[] mergedArr = arr1.Concat(arr2).ToArray();

// 方式2:手动复制元素
double[] mergedArr = new double[arr1.Length + arr2.Length];
Array.Copy(arr1, mergedArr, arr1.Length);
Array.Copy(arr2, 0, mergedArr, arr1.Length, arr2.Length);

但这两种方式生成的都是全新数组,修改arr1或arr2的元素,mergedArr不会同步变化。

实现联动更新的合并“数组”

要实现原数组修改时合并集合自动更新,不能用原生数组,得自定义一个包装类,内部持有原数组的引用,通过索引器动态返回对应位置的元素:

public class MergedArrayWrapper
{
    private readonly double[] _array1;
    private readonly double[] _array2;

    public MergedArrayWrapper(double[] array1, double[] array2)
    {
        _array1 = array1 ?? throw new ArgumentNullException(nameof(array1));
        _array2 = array2 ?? throw new ArgumentNullException(nameof(array2));
    }

    // 获取合并后的总长度
    public int Length => _array1.Length + _array2.Length;

    // 自定义索引器,动态映射到原数组
    public double this[int index]
    {
        get
        {
            if (index < 0 || index >= Length)
                throw new IndexOutOfRangeException();
            
            return index < _array1.Length ? _array1[index] : _array2[index - _array1.Length];
        }
        set
        {
            if (index < 0 || index >= Length)
                throw new IndexOutOfRangeException();
            
            if (index < _array1.Length)
                _array1[index] = value;
            else
                _array2[index - _array1.Length] = value;
        }
    }

    // 支持foreach遍历
    public IEnumerator<double> GetEnumerator()
    {
        foreach (var item in _array1)
            yield return item;
        foreach (var item in _array2)
            yield return item;
    }
}

使用示例

double[] arr1 = new double[2] { 1, 2 };
double[] arr2 = new double[2] { 3, 4 };

var mergedWrapper = new MergedArrayWrapper(arr1, arr2);

// 访问合并后的元素
Console.WriteLine(mergedWrapper[0]); // 输出1
Console.WriteLine(mergedWrapper[3]); // 输出4

// 修改原数组arr1的元素,合并wrapper同步更新
arr1[0] = 10;
Console.WriteLine(mergedWrapper[0]); // 输出10

// 通过wrapper修改元素,原数组也会同步变化
mergedWrapper[2] = 30;
Console.WriteLine(arr2[0]); // 输出30

这个包装类不会创建新数组,所有读写操作都直接指向原数组的引用,所以原数组的修改会实时反映在wrapper的访问结果中。如果需要更贴近原生数组的行为,还可以让这个类实现IList<double>接口,支持更多集合操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:50:24