这是一个简单的,我相信,但我似乎无法在谷歌上找到它。
如果我有一个功能:
foo(int[] a) {}
我希望用数组的子数组来调用它:
for instance: myNums[3]+ (i.e. an array {4,5,6}), given myNums:
int[] myNums = { 1,2,3,4,5,6};
当然,我不想创建只包含那些子项的新数组。我当然可以传递数组和索引,但后来我必须用偏移量编写所有函数代码......丑陋。
那么,如何在C#(.NET 2.0)中做到这一点?
foo(&myNums[3])
报告不安全。
foo(myNums[3])
不起作用(它只传递一个int)。
我是否需要将此映射到某种集合?
答案 0 :(得分:4)
将数组的地址传递给函数是C#开箱即用所不支持的。您必须使用 unsafe 方法执行此操作,代码将类似于C(尽管您需要使用unsafe选项进行编译)。或者您必须按照托管代码的方式对其进行编码,在这种情况下,传递偏移。
public Form1()
{
InitializeComponent();
int[] a = { 4, 5, 6, 7, 8 };
unsafe
{
fixed (int* c = a)
{
SubArrayPointer(c + 3);
}
}
SubArray(a, 3);
}
unsafe void SubArrayPointer(int* d)
{
MessageBox.Show(string.Format("Using pointer, outputs 7 --> {0}", *d));
}
void SubArray(int[] d, int offset)
{
MessageBox.Show(string.Format("Using offset, outputs 7 --> {0}", d[offset]));
}
答案 1 :(得分:3)
如果你有一个完全按照定义的函数(即它需要一个数组),你就无法做到这一点。
如果你的函数需要一些收集接口,例如:
void foo(IList<int> a) { ... }
然后你可以将一个数组传递给它,你也可以编写自己的IList<T>
实现来包装任何其他IList<T>
的子范围(但是在FCL中没有这个库存解决方案) )。
答案 2 :(得分:2)
使用LINQ扩展方法:
int[] myNums = { 1,2,3,4,5,6 };
var subset = myNums.Skip(2).Take(2); //will contain 3,4
int[] subsetAsArray = myNums.Skip(2).Take(2).ToArray();
这假设您使用的是.NET 3.0+。您还需要在代码文件中包含System.Linq。