如何创建起始索引为 1(而不是 0)的 ArrayList
如何以 1 而不是 0 开始索引?有没有办法直接在代码中做到这一点?ArrayList
(请注意,我要求的是,对于普通数组,请参阅在c#中对任意起始索引初始化数组ArrayList
)
如何以 1 而不是 0 开始索引?有没有办法直接在代码中做到这一点?ArrayList
(请注意,我要求的是,对于普通数组,请参阅在c#中对任意起始索引初始化数组ArrayList
)
执行此操作的明显方法是将 ArrayList 包装在自己的实现中,并在使用索引的所有操作中从索引器中减去 1。
实际上,您还可以在 .NET 中声明具有任意下限的数组(向下滚动到“创建具有非零下限的数组”部分)。
话虽如此,请不要在生产代码中执行此操作。保持一致性很重要。
这样做的一个合法理由是编写单元测试。某些第三方 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#数组中复制它们。这些缺点在测试代码中都不应该是一个大问题。