在c#中重新启动基于1的数组

Ces*_*ere 9 .net c# excel

我在c#中有一个基于1的数组(通过调用Excel范围的get_Value生成我得到一个2D数组,例如

object[,] ExcelData = (object[,]) MySheet.UsedRange.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);
Run Code Online (Sandbox Code Playgroud)

这显示为一个数组,例如ExcelData [1..20,1..5]

有什么方法可以告诉编译器对此进行rebase,这样我就不需要在整个时间内向循环计数器添加1?

List<string> RowHeadings = new List<string>();
string [,] Results = new string[MaxRows, 1]
for (int Row = 0; Row < MaxRows; Row++) {
    if (ExcelData[Row+1, 1] != null)
        RowHeadings.Add(ExcelData[Row+1, 1]);
        ...
        ...
        Results[Row, 0] = ExcelData[Row+1, 1];
        & other stuff in here that requires a 0-based Row
}
Run Code Online (Sandbox Code Playgroud)

它使得事物的可读性降低,因为创建用于写入数组的数组将基于零.

And*_*are 10

为什么不改变你的指数呢?

List<string> RowHeadings = new List<string>();
for (int Row = 1; Row <= MaxRows; Row++) {
    if (ExcelData[Row, 1] != null)
        RowHeadings.Add(ExcelData[Row, 1]);
}
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个扩展方法,它将从原始数组创建一个新的,从零开始的数组(基本上它只是创建一个较小的一个元素的新数组,并复制到该新数组所有元素,但你当前的第一个元素无论如何跳过):

public static T[] ToZeroBasedArray<T>(this T[] array)
{
    int len = array.Length - 1;
    T[] newArray = new T[len];
    Array.Copy(array, 1, newArray, 0, len);
    return newArray;
}
Run Code Online (Sandbox Code Playgroud)

话虽这么说,你需要考虑创建一个新数组的惩罚(无论多么轻微)是否值得提高代码的可读性.我没有做出判断(很可能是值得的)我只是确保你不使用这段代码,如果它会损害你的应用程序的性能.


Dar*_*mas 6

ExcelData使用this[,]索引器为数组创建包装器并在那里执行rebasing逻辑.就像是:

class ExcelDataWrapper
{
    private object[,] _excelData;
    public ExcelDataWrapper(object[,] excelData)
    {
        _excelData = excelData;
    }
    public object this[int x, int y]
    {
        return _excelData[x+1, y+1];
    }
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 6

由于您需要Row保持原样(基于您的注释),您可以引入另一个循环变量:

List<string> RowHeadings = new List<string>();
string [,] Results = new string[MaxRows, 1]
for (int Row = 0, SrcRow = 1; SrcRow <= MaxRows; Row++, SrcRow++) {
    if (ExcelData[SrcRow, 1] != null)
        RowHeadings.Add(ExcelData[SrcRow, 1]);
        ...
        ...
        Results[Row, 0] = ExcelData[SrcRow, 1];
}
Run Code Online (Sandbox Code Playgroud)