C#数组,为什么没有一个负数作为索引的数组?这种情况有时非常有用;特别是对于一些特殊类型的排序中的快速算法。两个问题:1)为什么不呢? 2)任何有效的解决方法?
答案 0 :(得分:3)
您始终可以使用indexer实现自己的课程。例如:
public class MyClass {
public String this[int index] {
get {
// ...
}
set {
// ...
}
}
}
其中String
是返回类型作为示例。
答案 1 :(得分:2)
在某些语言中,数组从零开始,因为到项目的数据结构的基础偏移从零开始。这是最简单的实现,它让程序员以最好的方式使用它。
某些语言允许使用其他基本索引,但是从索引计算偏移量需要额外的成本。你在简单的代码中获得了什么,你会在更复杂的数组实现中失败。
最有效的解决方法是在访问阵列时自己调整索引。还有其他解决方案可以提供更清晰的代码,但它们效率不高。例如,您可以将数组包装在一个类中,并提供一个可以调整索引的索引器,从而实现具有合理开销的无缝实现。
答案 2 :(得分:2)
您可以创建自己的类,它将包装数组并在访问时提供索引转换。你会想写这样的东西:
public class ArrayWithAnyIndexes<ArrayType>
{
private ArrayType[] arrayToWrap;
private int firstIndex;
public ArrayWithAnyIndexes(ArrayType[] arrayToWrap, int firstIndex)
{
this.arrayToWrap = arrayToWrap;
this.firstIndex = firstIndex;
}
public ArrayTypethis[int index] {
public get {
return this.arrayToWrap[index - firstIndex];
}
public set {
this.arrayToWrap[index - firstIndex] = value;
}
}
}
答案 3 :(得分:2)
理论上Array.CreateInstance
method 可用于创建非零下限的数组:
Array.CreateInstance(
elementType: typeof(T),
lengths: new int[] { length },
lowerBounds: new int[] { lowerBound });
唯一的麻烦是C#不允许你将返回的数组转换为T[]
;对于多维数组(T[,]
等),只允许和工作。
这可能在某种程度上是由于CLR特别处理零下限为零的一维数组;这些被称为“向量”并得到一些特殊的优化,既不是多维数组也不是具有非零下限的数组。
但事实上,我不确定为什么完全 C#将一维数组限制为向量。