簡體   English   中英

C# 中的 Redim Preserve?

[英]Redim Preserve in C#?

今天我震驚地發現 C# 不支持動態大小的數組。 那么,一個習慣使用ReDim PreserveVB.NET開發人員如何在 C# 中處理這個問題呢?

在函數的開頭,我不確定數組的上限。 這取決於從數據庫返回的行。

VB.NET 也沒有動態大小數組的想法——CLR 不支持它。

“Redim Preserve”的等價物是Array.Resize<T> - 但您必須注意,如果有其他對原始數組的引用,它們根本不會被更改。 例如:

using System;

class Foo
{
    static void Main()
    {
        string[] x = new string[10];
        string[] y = x;

        Array.Resize(ref x, 20);
        Console.WriteLine(x.Length); // Prints out 20
        Console.WriteLine(y.Length); // Still prints out 10
    }
}

證明這相當於 Redim Preserve:

Imports System

Class Foo
    Shared Sub Main()
        Dim x(9) as String
        Dim y as String() = x

        Redim Preserve x(19)
        Console.WriteLine(x.Length)
        Console.WriteLine(y.Length)
    End Sub
End Class

這兩個程序是等價的。

如果你真的想要一個動態大小的集合,你應該使用List<T> (或類似的東西)。 直接使用數組存在各種問題 - 有關詳細信息,請參閱Eric Lippert 的博客文章 這並不是說無論如何你都應該避免它們——但你需要知道你在處理什么。

改用 ArrayLists 或泛型

使用列表<T>。 它將根據需要動態調整大小。

你真的不應該使用 ReDim,它可能非常昂貴。 我更喜歡 List(Of T),但是這方面有很多選擇。

也就是說,你有一個問題,這是你的答案。

x = (int[]) Utils.CopyArray((Array) x, new int[10]);

我不禁注意到,以上答案都沒有接近多維數組的概念。 話雖如此,這里有一個例子。 有問題的數組預定義為x

int[,] temp = new int[newRows, newCols];
int minRows = Math.Min(newRows, x.GetUpperBound(0) + 1);
int minCols = Math.Min(newCols, x.GetUpperBound(1) + 1);
for (int i = 0; i < minRows ; ++i)
     for (int j = 0; j < minCols; ++j)
         temp[i, j] = x[i, j];
x = temp;

只是為了好玩,這是使用泛型來重新調整/擴展一維數組的一種方法(再添加一個“行”):

static T[] Redim<T>(T[] arr, bool preserved)
{
    int arrLength = arr.Length;
    T[] arrRedimed = new T[arrLength + 1];
    if (preserved)
    {
        for (int i = 0; i < arrLength; i++)
        {
            arrRedimed[i] = arr[i];
        }
    }
    return arrRedimed;
}

還有一個添加 n 行(盡管這不會阻止用戶縮小數組,這將在 for 循環中引發錯誤):

static T[] Redim<T>(T[] arr, bool preserved, int nbRows)
{
    T[] arrRedimed = new T[nbRows];
    if (preserved)
    {
        for (int i = 0; i < arr.Length; i++)
        {
            arrRedimed[i] = arr[i];
        }
    }
    return arrRedimed;
}

我相信你明白了。

對於多維數組(二維),這是一種可能性:

static T[,] Redim<T>(T[,] arr, bool preserved)
{
    int Ubound0 = arr.GetUpperBound(0);
    int Ubound1 = arr.GetUpperBound(1);
    T[,] arrRedimed = new T[Ubound0 + 1, Ubound1];
    if (preserved)
    {
        for (int j = 0; j < Ubound1; j++)
        {
            for (int i = 0; i < Ubound0; i++)
            {
                arrRedimed[i, j] = arr[i, j];
            }
        }
    }
    return arrRedimed;
}

在您的程序中,無論是否使用指定的類型,編譯器都會識別它:

int[] myArr = new int[10];
myArr = Redim<int>(myArr, true);

或者

int[] myArr = new int[10];
myArr = Redim(myArr, true);

不確定這一切是否真的相關。 =D 請隨時糾正我或改進我的代碼。 ;)

即使很久以前它可能會幫助尋找簡單解決方案的人 - 我在另一個論壇中發現了一些很棒的東西:

//from Applied Microsoft.NET framework Programming - Jeffrey Richter
public static Array RedimPreserve(Array origArray, Int32 desiredSize)
        {
            System.Type t = origArray.GetType().GetElementType();
            Array newArray = Array.CreateInstance(t, desiredSize);
            Array.Copy(origArray, 0, newArray, 0, Math.Min(origArray.Length, desiredSize));
            return newArray;
        }

資料來源: https ://social.msdn.microsoft.com/Forums/en-US/6759816b-d525-4752-a3c8-9eb5f4a5b194/redim-in-c?forum=csharplanguage

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM