2016-01-24 59 views
5

我试图弄清楚是否有一种方法可以在C#中完成某些操作,这在C++中很容易实现。特别是,如果我有一个数据数组,我可以创建一个指向该数据的指针以更方便地访问子部分。访问数组子集的方法?

举例来说,如果我有:

unsigned char buffer[1000]; 

,我确定有一个在该阵列内的位置102至110串,我需要处理很多,我可以这样做:

unsigned char *strPtr = &buffer[102]; 
char firstChar = strPtr[0]; 

这使我无需在后续操作中为每个数组索引添加“102”。

虽然我认识到当你做这样的事情时出现不安全情况的可能性,但我想知道在C#中是否存在一个道德等价物,它可以让我创建一个新的对现有数组子集的引用。

喜欢的东西:

byte [8] newArray = &buffer[102]; 

这个例子实际上并没有工作或我不会张贴这一点,但我认为它得到了什么我要完成整个想法。

+0

你想要它是一个副本或直接修改原始数组吗? – BalinKingOfMoria

+0

我真的不会写回来,只是从中读取。我想避免复制数据。事实上,我不会问复制数据是不是跳闸点。 –

+0

如果你关心的只是从数据中读取,为什么不保留一个'int offset = 102;缓冲区[offset + i] ...'?这意味着你不需要不安全的代码来完成任务。 'ArraySegment '绝对是一种更干净的方法。如果您真的想要避免偏移计算出于某种原因,那么您必须使用不安全的代码。 –

回答

4

ArraySegment<T>类可以用作包装来访问数组的段。只需提供数组,偏移量和段的长度,并且可以像使用实际数组那样使用它。你会得到边界检查和使用数组的其他细节。

var buffer = new byte[1000]; 
var newArray = new ArraySegment<byte>(buffer, 102, 8) as IList<byte> // we have an "array" of byte[8] 
var firstChar = newArray[0]; 

有一个proposal然而引入阵列切片。就像ArraySegment一样,切片允许您创建视图到数组(无需制作副本),并且可以用来代替实际的数组。希望它能够成为未来的C#版本。

+0

是不是ArraySegment 通过使用偏移获取/更改原始错误的预期元素来执行OP试图避免的内容?我认为这种结构通过添加索引+内部的_offset并返回结果元素起作用。 –

+0

@JasonW但是在OP中描述的技术正是这样一种快捷方式,它为数组添加一个“偏移量”。 – Kroltan

+0

好像他试图避免每次访问元素时添加偏移量。我知道_offset存储在结构中,但我不确定的是,如果每次访问元素时都使用_offset(这是我认为他无论出于什么原因都试图阻止) –