从offset开始获取数组

时间:2009-06-28 22:26:57

标签: c# arrays

我正在使用C#,而且我无法从像C ++这样的特定点开始发送数组,这很烦人。

假设这段代码:

int[] array = new int[32];
foobar (array + 4); //send array starting from the 4th place.

这是C#的一种奇怪的语法,因为我们没有任何可用的指针,但肯定有办法吗? 有.Skip(),但我认为它产生了一个新的数组,这是我不喜欢的。

我有什么选择?

4 个答案:

答案 0 :(得分:17)

您可能希望将其作为IEnumerable<int>而不是数组传递。然后,您可以使用skip,它只会将迭代器移动到跳过的元素数量上。使用这种方式,您不必使用ToArray()并创建相关数组部分的副本。当然,IEnumerable可能不适合您想要做的事情,但是很难从您的问题中判断出来。

public void FooBar( IEnumerable<int> bar )
{
  ...
}

int[] array = new int[32];
FooBar( array.Skip(4) );

答案 1 :(得分:3)

我可以欣赏你想要做的事情,但你不能(也不应该尝试)发送对“数组的一部分”的引用。在C#中,数组是对象,而不是指针。这是一个重要的区别。发送对“部分对象”的引用是没有意义的。

当你将一个对象的一部分传递给一个方法时,它应该怎么做?

  • array.Length将返回什么?
  • 如果调用方法对数组进行排序(只是它是数组的一部分)怎么办?
  • 如果数组是自引用的(即数组元素引用数组的其他部分),该怎么办?你是否以某种方式“锁定”访问传递给方法的而不是的数组元素?
  • 调用方法现在是否需要检查一个标志,以确定它们是否具有“完整对象?”这会打破很多现有的代码。

如果您的方法只需要部分数组(并且您不想创建本地副本),那么最好的解决方案是传递数组引用以及访问所需部分所需的任何其他信息。 / p>

享受,

Robert C. Cartaino

答案 2 :(得分:3)

.NET有System.ArraySegment包装器 - 不幸的是,它完全没用,因为它没有实现IEnumerable

答案 3 :(得分:1)

您可以将偏移量作为参数传递给函数本身。然后,该函数将简单地遍历从[array + offset]到array.Length的元素。那,或者将子数组复制到一个新数组中,但这可能不是最佳的。