如何创建起始索引为 1(而不是 0)的 ArrayList

2022-09-05 00:25:49

如何以 1 而不是 0 开始索引?有没有办法直接在代码中做到这一点?ArrayList

(请注意,我要求的是,对于普通数组,请参阅在c#中对任意起始索引初始化数组ArrayList)


答案 1

执行此操作的明显方法是将 ArrayList 包装在自己的实现中,并在使用索引的所有操作中从索引器中减去 1。

实际上,您还可以在 .NET 中声明具有任意下限的数组(向下滚动到“创建具有非零下限的数组”部分)。

话虽如此,请不要在生产代码中执行此操作。保持一致性很重要。


答案 2

这样做的一个合法理由是编写单元测试。某些第三方 SDK(例如 Excel COM 互操作)希望您使用具有基于一个的索引的数组。如果使用此类 SDK,则可以并且应该在 C# 测试框架中存根此功能。

以下方法应该有效:

object[,] comInteropArray = Array.CreateInstance(
    typeof(object),
    new int[] { 3, 5 },
    new int[] { 1, 1 }) as object[,];

System.Diagnostics.Debug.Assert(
     1 == comInteropArray.GetLowerBound(0),
    "Does it look like a COM interop array?");
System.Diagnostics.Debug.Assert(
     1 == comInteropArray.GetLowerBound(1),
    "Does it still look like a COM interop array?");

我不知道是否有可能将其转换为标准的C#样式数组。可能不是。我也不知道有哪种方法可以对此类数组的初始值进行硬编码,除了循环以从具有硬编码初始值的标准C#数组中复制它们。这些缺点在测试代码中都不应该是一个大问题。


推荐