Преобразовать объект [,] в строку [,]?

Как бы вы преобразовали object[,] в string[,]?

Object[,] myObjects= // sth
string[,] myString = // ?!? Array.ConvertAll(myObjects, s => (string)s) // this doesn't work

Любые предложения оценены.

EDIT: Конечно, решение цикла, очевидно, сделает это, однако я предвидел более элегантное решение как с точки зрения кода, так и с точки зрения производительности.

EDIT2: object[,] содержит, конечно, string (и цифры, но на данный момент это не имеет значения).

Ответ 1

Object[,] myObjects = new Object[3, 2] { { 1, 2 }, { 3, 4 },
                                        { 5, 6 } };

string[,] myString = new string[3, 2];

for (int i = myObjects.GetLowerBound(0); i < myObjects.GetUpperBound(0); i++)
{
     for (int j = myObjects.GetLowerBound(1); j < myObjects.GetUpperBound(1); j++)
     {
          myString[i, j] = myObjects[i, j].ToString();
     }
}

foreach (var item in myString)
{
    Console.WriteLine("{0} - {1}", item.GetType(), item);
}

Выход будет:

System.String - 1
System.String - 2
System.String - 3
System.String - 4
System.String - 5
System.String - 6

Ответ 2

Вы можете выделить пространство, подобное этому

string[,] myString = new string[myObjects.GetLength(0),myObjects.GetLength(1)];

Затем некоторые петли должны работать нормально, например:

for(int k=0;k < myObjects.GetLength(0);k++)
    for(int l=0;l < myObjects.GetLength(1);l++)
        myString[k,l] = myObjects[k,l].ToString();

Ответ 3

Учитывая другие ответы, очень легко написать собственный метод ConvertAll для 2D-массивов:

public static TOutput[,] ConvertAll<TInput, TOutput>(TInput[,] array, Func<TInput, TOutput> converter)
{
    var result = new TOutput[array.GetLength(0), array.GetLength(1)];
    for (int i = 0; i < array.GetLength(0); ++i)
        for (int j = 0; j < array.GetLength(1); ++j)
            result[i, j] = converter(array[i, j]);

    return result;
}

Просто потому, что авторы .NET не хотели включать этот метод, нет необходимости полностью отказаться. Это довольно прямо, чтобы написать его самостоятельно.

(Вы могли бы сделать это методом расширения, если хотите.)

ИЗМЕНИТЬ после комментариев: Если вы действительно хотите обрабатывать массивы, нижняя граница которых (в некоторой размерности) не равна нулю, она выглядит примерно так:

public static TOutput[,] ConvertAll<TInput, TOutput>(TInput[,] array, Func<TInput, TOutput> converter)
{
    int xMin = array.GetLowerBound(0);
    int xLen = array.GetLength(0);
    int yMin = array.GetLowerBound(1);
    int yLen = array.GetLength(1);
    var result = (TOutput[,])Array.CreateInstance(typeof(TOutput), new[] { xLen, yLen, }, new[] { xMin, yMin, });
    for (int x = xMin; x < xMin + xLen; ++x)
        for (int y = yMin; y < yMin + yLen; ++y)
            result[x, y] = converter(array[x, y]);

    return result;
}

Ответ 4

Это должно быть одним из самых простых и быстрых способов, предполагая, что каждый элемент в массиве src можно отбросить до типа массива dst.

object[,] src = new object[,]
{
    {"foo", "bar"},
    {"spam", "eggs"},
};

string[,] dest = new string[src.GetLength(0), src.GetLength(1)];
Array.Copy(src, dest, src.Length);