C# 传递具有特定数组索引的数组
C# Passing array with specific array index
我想在 C# 中将数组传递给具有特定索引的函数,就像我们在 C++ 中所做的那样,如下所示:
void foo(int* B) {
// do something;
}
int main() {
int A[10];
foo(A + 3);
}
在这种情况下,假设 A
以基地址 1000
开头,那么 B 将是 1000+(sizeof(int)*3)
。 link 中的答案使用 Skip()
函数调用,但在这种情况下 B
应该是 IEnumerable<int>
类型,并且在使用 ToArray()
调用 Skip()
时创建一个具有不同基地址的副本,但我想将这个相同的数组传递给函数 foo。我们如何在 C# 中做到这一点?
这里已经回答了这个问题:
C# Array slice without copy
您可以使用 ArraySegment 或 Span 来实现此目的
public static void Main()
{
int[] arr1 = new int[] {2, 5, 8, 10, 12};
int[] arr2 = new int[] {10, 20, 30, 40};
DoSomethingWithSegmentReference(new ArraySegment<int>(arr1, 2, arr1.Length - 2));
DoSomethingWithSpanReference(arr2.AsSpan().Slice(1, arr2.Length - 1));
}
private static void DoSomethingWithSegmentReference(ArraySegment<int> slice){
for(int i = 0; i < slice.Count; i++)
slice[i] = slice[i] * 2;
}
private static void DoSomethingWithSpanReference(Span<int> slice){
for(int i = 0; i < slice.Length; i++)
slice[i] = slice[i] * 2;
}
我想在 C# 中将数组传递给具有特定索引的函数,就像我们在 C++ 中所做的那样,如下所示:
void foo(int* B) {
// do something;
}
int main() {
int A[10];
foo(A + 3);
}
在这种情况下,假设 A
以基地址 1000
开头,那么 B 将是 1000+(sizeof(int)*3)
。 link 中的答案使用 Skip()
函数调用,但在这种情况下 B
应该是 IEnumerable<int>
类型,并且在使用 ToArray()
调用 Skip()
时创建一个具有不同基地址的副本,但我想将这个相同的数组传递给函数 foo。我们如何在 C# 中做到这一点?
这里已经回答了这个问题: C# Array slice without copy
您可以使用 ArraySegment 或 Span 来实现此目的
public static void Main()
{
int[] arr1 = new int[] {2, 5, 8, 10, 12};
int[] arr2 = new int[] {10, 20, 30, 40};
DoSomethingWithSegmentReference(new ArraySegment<int>(arr1, 2, arr1.Length - 2));
DoSomethingWithSpanReference(arr2.AsSpan().Slice(1, arr2.Length - 1));
}
private static void DoSomethingWithSegmentReference(ArraySegment<int> slice){
for(int i = 0; i < slice.Count; i++)
slice[i] = slice[i] * 2;
}
private static void DoSomethingWithSpanReference(Span<int> slice){
for(int i = 0; i < slice.Length; i++)
slice[i] = slice[i] * 2;
}