繁体   English   中英

在C#中将子数组作为数组传递

[英]Passing a sub array as an array in C#

我很确定这是一个简单的,但我似乎无法在谷歌上找到它。

如果我有一个功能:

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)。

我需要将其映射到某种集合吗?

将数组的地址传递给函数是C#开箱即用所不支持的。 要么你必须使用不安全的方法,代码将是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]));
    }

如果你有一个完全按照定义的函数(即它需要一个数组),你就无法做到这一点。

如果你有一个函数可以采用一些集合接口,例如:

void foo(IList<int> a) { ... }

那么你可以将一个数组传递给它,你也可以编写自己的IList<T>实现来包装任何其他IList<T>的子范围(但是在FCL中没有这个库存解决方案)。

使用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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM