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