C#数组,为什么没有一个具有负数作为索引的数组?这种情况有时非常有用;特别是对于一些特殊类型的排序中的快速算法。两个问题:1)为什么不呢? 2)任何有效的解决方法?为什么不用一个负数作为索引的数组?
回答
您可以随时使用indexer实现自己的班级。例如:
public class MyClass {
public String this[int index] {
get {
// ...
}
set {
// ...
}
}
}
其中String
为返回类型为例。
在某些语言中,数组从零开始,因为数据结构对项目的底层偏移量从零开始。这是最简单的实现方式,它使程序员可以最好地使用它。
有些语言允许使用其他基本索引,但是从索引计算偏移量需要额外的成本。在简单的代码中你获得了什么,你会失去一个更复杂的数组实现。
最有效的解决方法是在访问数组时自行调整索引。还有其他解决方案可以提供更清晰的代码,但效率不高。例如,您可以将数组包装到一个类中,并提供一个索引器来调整索引,从而实现具有合理开销的无缝实现。
您可以创建自己的类,该类将包装数组并在访问时提供索引转换。你会想要写这样的事情:
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;
}
}
}
的Array.CreateInstance
method可以在理论上可以用来与非零下界创建数组:
Array.CreateInstance(
elementType: typeof(T),
lengths: new int[] { length },
lowerBounds: new int[] { lowerBound });
唯一的问题是,C#韩元不允许你将返回的数组转换为T[]
;这只会是允许的,并且适用于多维数组(T[,]
等)。
这很可能在某种程度上是由于CLR专门处理一个下界为零的一维数组;这些被称为“矢量”并得到一些特殊的优化,既不是多维数组也不是具有非零下界的数组。
但是事实上,我不确定为什么恰恰是 C#将一维数组限制为向量。
Interresting,但是当我尝试调用它时,我得到'System.InvalidCastException:无法将类型为'System.String [*]'的对象转换为键入'System.String []'。 – Guffa
@Guffa:哦,男孩......你说得对。我刚刚检查了我的“CLR通过C#”的副本。这种转换对于一维数组是不可能的。这使得我的答案毫无用处,但我会在纠正状态下将其留在那里。 – stakx
你可以将你在'IList'接口的**非泛型**版本的答案中创建的'T [*]'数组强制转换。然后你可以像'T read =(T)arr [-12];'和'arr [-12] = write;'那样访问它。不幸的是,你不能使用带'T [*]'数组的通用'IList
- 1. 为什么ArrayList#rangeCheck不检查索引是否为负数?
- 2. 为什么不能可索引类型可以作为一个数组C#
- 3. 为什么我不能使用u8作为Rust数组中的索引号?
- 4. 负数组索引
- 5. 负数组索引
- 6. 为什么我得到一个数组索引越界异常?
- 7. 为什么我得到一个数组索引越界异常?
- 8. 为什么使用变量调用数组索引不好?
- 9. preg_match_all只返回索引为0的第一个数组,而不是索引为1的第一个数组
- 10. 使用数组作为python的索引
- 11. 作为数组索引的C++传递函数不起作用。
- 12. JS数组不能作为索引
- 13. 记录数组索引,而不是数值(JavaScript) - 为什么?
- 14. 为什么这个数组不一致?
- 15. 为什么数组索引或基索引以0开头?
- 16. 为一个静态铸造索引数组做一个数组
- 17. 为什么我使用“我”作为我的数组索引后得到1?
- 18. 为什么JavaScript数组索引由数组长度设置
- 19. 为什么数组返回值与数组索引值?
- 20. 使用变量作为数组索引
- 21. 使用变量作为数组索引
- 22. 为什么这个数组不为零?
- 23. 为什么我不能直接访问带索引的数组?
- 24. 为什么数组的索引/列表不以1开头?
- 25. 为什么不能传递一个二维数组作为函数参数?
- 26. 为什么不能在Python中使用锯齿形数组中的第二个索引的负值?
- 27. C++二维数组索引与1参数(为什么这个工作?)
- 28. 如何使用数组元素作为另一个数组的索引
- 29. 作为不同数组索引的数组元素
- 30. 考虑到第一个元素作为支点,为什么索引不会超出数组的边界?
您可以使用“Dictionary”从负数映射到别的东西。 –
您可以创建一个派生自链接列表的类,并重载[]运算符以使用数组。 – TomF
你的意思是-1应该返回数组中的最后一个元素吗? – ProgramFOX