如何将对象转换为对象[]

时间:2012-03-28 15:46:35

标签: c#

我有object,其值可能是int[]string[]等几种数组类型之一,我想将其转换为string[]。我的第一次尝试失败了:

void Do(object value)
{
    if (value.GetType().IsArray)
    {
        object[] array = (object[])value;
        string[] strings = Array.ConvertAll(array, item => item.ToString());
        // ...
    }
}

运行时错误Unable to cast object of type 'System.Int32[]' to type 'System.Object[]',这在回顾中是有意义的,因为我的int[]不包含盒装整数。

在我四处寻找之后,我到达了这个工作版本:

void Do(object value)
{
    if (value.GetType().IsArray)
    {
        object[] array = ((Array)value).Cast<object>().ToArray();
        string[] strings = Array.ConvertAll(array, item => item.ToString());
        // ...
    }
}

我想这没关系,但看起来很复杂。任何人都有更简单的方法吗?

4 个答案:

答案 0 :(得分:18)

您无需将其转换为数组,然后使用LINQ。您可以采用更流式的方式进行,最后只转换为数组:

var strings = ((IEnumerable) value).Cast<object>()
                                   .Select(x => x == null ? x : x.ToString())
                                   .ToArray();

(请注意,这将保留空值,而不是抛出异常。对于任何IEnumerable,它也没有问题,而不仅仅是数组。)

答案 1 :(得分:0)

.ToArraymost cases中进行了多次内存分配,但是围绕它的方法很少:

object value = new[] { 1, 2.3 };

IList list = value as IList;
string[] strings = new string[list.Count];

for (int i = 0; i < strings.Length; i++)
    strings[i] = Convert.ToString(list[i]);

在大多数情况下可能有点过度和浪费垂直空间,所以我会使用类似已接受的答案和可选的null-conditional operator ?来检查源是否是数组:

string[] strings = (value as Array)?.Cast<object>().Select(Convert.ToString).ToArray();

答案 2 :(得分:-1)

void Do(object value)
{
    if (value.GetType().IsArray)
    {
       string[] strings = ((object[]) value).Select(obj => Convert.ToString(obj)).ToArray();
    }
}

答案 3 :(得分:-1)

下面的解决方案在 JAVA

public static Objects[] convertObjectToObjectArray(){
    Objects firstObject = new Object();

    return new Object[]{firstObject};
}

在上面的return语句中,您正在将对象转换为对象数组。

相关问题