簡體   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