12

您将如何转换object[,]string[,]?

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

任何建议表示赞赏。

编辑:当然,循环解决方案显然可以做到这一点,但是我在代码和性能方面都设想了一个更优雅的解决方案。

EDIT2:object[,]当然包含strings (和数字,但现在这无关紧要)。

4

4 回答 4

4
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
于 2013-04-30T10:38:46.363 回答
4

您可以像这样分配空间

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();
于 2013-04-30T10:46:29.367 回答
4

ConvertAll鉴于其他答案,为二维数组编写自己的方法真的很容易:

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;
}
于 2013-04-30T11:14:16.687 回答
3

这应该是最简单和最快的方法之一,假设数组中的每个元素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);
于 2013-04-30T11:10:54.987 回答