2013-10-05 38 views
2

鉴于一些阵列:创建新的引用数组不同长度

int[] array = new int[8000]; 

是否有可能是指一个新的阵列,使得:

int[] array2 = Array.SameReferenceDifferentLength(array, 4000); 
// array1.Length == 8000; 
// array2.Length == 4000; 
// &array2[0] == &array[0]; 
+0

你就不能进入循环的第一个拿到新的吗? – Tico

+1

简短的回答是“不”,但你总是可以通过包装一个数组并维护自己的“长度”来对其进行仿真,这个长度对于同一个数组的不同包装而言是不同的。 – Cameron

+1

@Cameron这不是真的。 .NET的'ArraySegment'结构恰好是OP的场景。 –

回答

4

使用ArraySegment结构:

var a = new string[] { "a", "b", "c", "d", "e" }; 

var b = new ArraySegment<string>(a, 1, 3); 

foreach (var s in b) 
{ 
    Console.WriteLine(s); 
} 

这会对数组的指定范围进行浅层引用。也就是说,它不复制阵列数据。

如果您想索引ArraySegment<T>,您可以将其转换为IList<T>,然后使用该接口提供的索引器。


为了模拟代码,你的问题:

int array = new int[8000]; 
var array2 = new ArraySegment<int>(array, 0, 4000); 
//array.Length == 8000 
//array2.Count == 4000 
//array == array2.Array 
+0

虽然,不完全是我所寻找的(我真的希望有一个类型为'int [];''ArraySegment .Array'的变量返回原始数组),我认为答案符合题。 我越想它,这种类型的废话可能只有在使用固定指针的不安全代码中才有可能。如果CLR必须跟踪是否引用了数组的任何部分才能收集数据,那将是一场噩梦。 – Imisnew2

+0

@ Imisnew2这就是'ArraySegment '看起来有点奇怪的原因。在没有进入不安全之地的情况下,这是最好的。你当然可以使用不安全的C#代码和指针来获得更直接的控制 - 这是我之前为某些图像处理所做的事情。 –