在 C# 中的任意起始索引上初始化数组
Posted
技术标签:
【中文标题】在 C# 中的任意起始索引上初始化数组【英文标题】:Initializing an array on arbitrary starting index in c# 【发布时间】:2010-09-10 03:00:01 【问题描述】:是否可以在 c# 中初始化一个数组,例如,子索引 1?
我正在使用 Office 互操作,每个属性都是一个从 1 开始的对象数组(我假设它最初是在 VB.NET 中编程的),你不能修改它,你必须为它设置整个数组接受更改。
作为一种解决方法,我正在克隆原始数组,修改该数组,并在完成后将其设置为一个整体。
但是,我想知道是否可以创建一个新的基于非零的数组
【问题讨论】:
vb.net 数组也是从 0 开始的。 但是如果你不想创建它们,你可以创建它们(新数组(3 到 5)或类似的东西) 【参考方案1】:您可以使用Array.CreateInstance
。
见Array Types in .NET
【讨论】:
我真的很想知道它在语法上是否可行,但这是一个很好的解决方案 请在您的答案中包含代码,而不是链接到明天可能不存在的文档。【参考方案2】:可以按照你的要求做,见下面的代码。
// Construct an array containing ints that has a length of 10 and a lower bound of 1
Array lowerBoundArray = Array.CreateInstance(typeof(int), new int[1] 10 , new int[1] 1 );
// insert 1 into position 1
lowerBoundArray.SetValue(1, 1);
//insert 2 into position 2
lowerBoundArray.SetValue(2, 2);
// IndexOutOfRangeException the lower bound of the array
// is 1 and we are attempting to write into 0
lowerBoundArray.SetValue(1, 0);
【讨论】:
+1:一个有用的代码块值得一千个不可读的散文关于代码链接。 有什么方法可以将其键入为 int[] 而不是 Array?【参考方案3】:我不认为您可以在 C# 中创建基于非零的数组,但您可以轻松地围绕内置数据结构编写自己的包装类。这个包装类将保存您的数组类型的私有实例必需的;不允许重载 [] 索引运算符,但您可以向类添加索引器以使其表现得像可索引数组,请参阅here。然后,您编写的索引函数可以对所有传入的索引加(或减)1。
然后您可以按如下方式使用您的对象,它会正常运行:
myArrayObject[1]; //would return the zeroth element.
【讨论】:
【参考方案4】:只需将名为 'offset' 的 const int 保留为 1,并始终将其添加到代码中的下标中。
【讨论】:
【参考方案5】:我不认为是否可以修改数组的起始索引。
我会使用泛型创建自己的数组并在内部处理它。
【讨论】:
【参考方案6】:不简单。但是您当然可以编写自己的课程。它将有一个数组作为私有变量,用户会认为他的数组从 1 开始,但实际上它从 0 开始,您从他的所有数组访问中减去 1。
【讨论】:
是的,你总是可以自己做任何事情......问题是它是否可以用 c# 语法来完成【参考方案7】:在 VB6 中,您可以将数组更改为以 0 或 1 开头,所以我认为 VBScript 也可以这样做。对于 C#,这是不可能的,但您可以简单地在第一个 [0] 中添加 NULL 值并在 [1] 处开始实际值。当然,这有点危险……
【讨论】:
属性要求数组从1开始,所以这行不通【参考方案8】:你可以编写自己的数组类
【讨论】:
以上是关于在 C# 中的任意起始索引上初始化数组的主要内容,如果未能解决你的问题,请参考以下文章