gpt4 book ai didi

c# - 如何获取子数组的引用

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:06 26 4
gpt4 key购买 nike

我正在尝试从现有数组中获取子数组的引用。当我对子数组进行修改时,我希望能够更新原始数组。示例:

byte[] array = {0 , 1, 2, 3, 4};
byte[] subarray = array.Skip(2).Take(3).ToArray();
subarray[0] = 8;
Console.WriteLine("array[2] = " + array[2]);

我想看看:

array[2] = 8

但相反,我得到:

array[2] = 2

我读了这个solution但它还不够好,因为我不想提供修改不在范围内的数组值的选项,如下所示:

ArraySegment<byte> segment = new ArraySegment<byte>(array, 2, 3);
byte[] segmentByte = segment.ToArray();

我可以通过segmentByte修改所有的原始数组。这就是我要防止的。

最佳答案

你可以写简单的ArrayArraySegment<of T>仅提供一组必需操作的包装器:

struct StrictRangeArraySegment<T>
{
ArraySegment<T> _segment;
public StrictRangeArraySegment(T[] array)
: this(array, 0, array.Length)
{
}
public StrictRangeArraySegment(T[] array, int offset, int count)
: this(new ArraySegment<T>(array, offset, count))
{
}
public StrictRangeArraySegment(ArraySegment<T> segment)
{
_segment = segment;
}

public int Count
{
get
{
return _segment.Count;
}
}

public T this[int index]
{
get
{
if (index < 0 || index >= _segment.Count)
throw new ArgumentOutOfRangeException(nameof(index));
return _segment.Array[_segment.Offset + index];
}
set
{
if (index < 0 || index >= _segment.Count)
throw new ArgumentOutOfRangeException(nameof(index));
_segment.Array[_segment.Offset + index] = value;
}
}
}

有关引用,请参阅 ArraySegment<Of T> source code .

关于c# - 如何获取子数组的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48398810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com