0

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

4

4 回答 4

3

您始终可以使用indexer实现您自己的类。例如:

public class MyClass {
    public String this[int index] {
        get {
            // ... 
        }

        set {
            // ... 
        }
    }
}

以返回String类型为例。

于 2013-10-06T17:21:36.673 回答
2

在某些语言中,数组从零开始,因为数据结构中到项目的基础偏移量从零开始。这是最简单的实现,它留给程序员以最好的方式使用它。

一些语言允许其他基本索引,但是计算与索引的偏移量需要额外的成本。你在更简单的代码中获得了什么,你在更复杂的数组实现中失去了。

最有效的解决方法是在访问数组时自己调整索引。还有其他解决方案可以提供更简洁的代码,但效率不高。例如,您可以将数组包装在一个类中,并提供一个调整索引的索引器,从而提供具有合理开销的无缝实现。

于 2013-10-06T17:28:29.617 回答
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;
        }
    }

}
于 2013-10-06T17:28:46.527 回答
2

Array.CreateInstance方法 理论上可以用于创建具有非零下限的数组:

Array.CreateInstance(
    elementType: typeof(T), 
    lengths: new int[] { length }, 
    lowerBounds: new int[] { lowerBound });

唯一的问题是 C# 不允许您将返回的数组转换为T[]; 这仅适用于多维数组(T[,]等)。

这可能在某种程度上是因为 CLR 专门处理下限为零的一维数组。这些被称为“向量”并获得一些特殊的优化,多维数组和具有非零下界的数组都不会收到。

但实际上,我不确定为什么C # 将一维数组限制为向量。

于 2013-10-06T17:35:52.303 回答