Как я могу преобразовать в штучной упаковке двумерный массив в двумерный массив строк за один шаг? - PullRequest
1 голос
/ 20 мая 2011

Есть ли способ преобразовать двумерный массив в штучной упаковке в массив двумерных строк за один шаг, используя C # / .NET Framework 4.0?

using ( MSExcel.Application app = MSExcel.Application.CreateApplication() ) {
    MSExcel.Workbook book1 = app.Workbooks.Open( this.txtOpen_FilePath.Text );
    MSExcel.Worksheet sheet1 = (MSExcel.Worksheet)book1.Worksheets[1];
    MSExcel.Range range = sheet1.GetRange( "A1", "F13" );
    object value = range.Value; //the value is boxed two-dimensional array
}

Я надеюсь, что какая-то форма Array.ConvertAll могла бы работать, но до сих пор ответ ускользал от меня.

Ответы [ 3 ]

1 голос
/ 20 мая 2011

Нет, я не думаю, что вы можете сделать преобразование за один шаг, но я могу ошибаться. Но вы, конечно, можете создать новый массив и скопировать из старого в новый:

object value = range.Value; //the value is boxed two-dimensional array
var excelArray = value as object[,];
var height = excelArray.GetLength(0);
var width = excelArray.GetLength(1);
var array = new string[width, height];
for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
        array[i, j] = excelArray[i, j] as string;
}

Edit:

Вот двумерная перегрузка Array.ConvertAll, которая не намного сложнее, чем код выше:

public static TOutput[,] ConvertAll<TInput, TOutput>(TInput[,] array, Converter<TInput, TOutput> converter)
{
    if (array == null)
    {
        throw new ArgumentNullException("array");
    }
    if (converter == null)
    {
        throw new ArgumentNullException("converter");
    }
    int height = array.GetLength(0);
    int width = array.GetLength(1);
    TOutput[,] localArray = new TOutput[width, height];
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
            localArray[i, j] = converter(array[i, j]);
    }
    return localArray;
}
1 голос
/ 20 мая 2011

Вы можете написать свои ConvertAll для двумерных массивов:

public static TOutput[,] ConvertAll<TInput, TOutput>(
    this TInput[,] array, Func<TInput, TOutput> converter)
{
    int length0 = array.GetLength(0);
    int length1 = array.GetLength(1);

    var result = new TOutput[length0, length1];

    for (int i = 0; i < length0; i++)
        for (int j = 0; j < length1; j++)
            result[i, j] = converter(array[i, j]);

    return result;
}
0 голосов
/ 20 мая 2011
string[][] strings = ((object[][])range.Value)
    .Select(x => x.Select(y => y.ToString()).ToArray()).ToArray();

Редактировать : Пояснение об объекте [,] вместо объекта [] [], очевидно, делает этот подход устаревшим.Интересная проблема;многомерные массивы довольно ограничены.

...