为什么不将具有负数的数组作为索引?

时间:2013-10-06 17:17:43

标签: c#

C#数组,为什么没有一个负数作为索引的数组?这种情况有时非常有用;特别是对于一些特殊类型的排序中的快速算法。两个问题:1)为什么不呢? 2)任何有效的解决方法?

4 个答案:

答案 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#将一维数组限制为向量。