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

Moh*_*oud 10 c# java arraylist

如何ArrayList以1而不是0 开始索引?有没有办法直接在代码中执行此操作?

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

dri*_*iis 19

显而易见的方法是在您自己的实现中包装ArrayList,并在使用索引的所有操作中从索引器中减去1.

实际上,您也可以在.NET中声明一个具有任意下限的数组(向下滚动到"使用非零下限创建数组"部分).

话虽如此,请不要在生产代码中执行此操作.重要的是保持一致.


Eri*_*rst 7

这样做的一个合理理由是编写单元测试.某些第三方SDK(例如Excel COM interop)希望您使用具有基于一个索引的数组.如果您正在使用此类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?");
Run Code Online (Sandbox Code Playgroud)

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