C# 如何将对象转换为对象[]
我有一个C# 如何将对象转换为对象[],c#,C#,我有一个对象,其值可以是几种数组类型之一,如int[]或string[],我想将其转换为string[]。我的第一次尝试失败了: void Do(object value) { if (value.GetType().IsArray) { object[] array = (object[])value; string[] strings = Array.ConvertAll(array, item => item.ToString());
对象
,其值可以是几种数组类型之一,如int[]
或string[]
,我想将其转换为string[]
。我的第一次尝试失败了:
void Do(object value)
{
if (value.GetType().IsArray)
{
object[] array = (object[])value;
string[] strings = Array.ConvertAll(array, item => item.ToString());
// ...
}
}
出现运行时错误时,无法将类型为“System.Int32[]”的对象强制转换为类型为“System.object[]”
,这在retrospect中很有意义,因为我的int[]
不包含装箱整数
经过反复研究,我得出了以下工作版本:
void Do(object value)
{
if (value.GetType().IsArray)
{
object[] array = ((Array)value).Cast<object>().ToArray();
string[] strings = Array.ConvertAll(array, item => item.ToString());
// ...
}
}
void Do(对象值)
{
if(value.GetType().IsArray)
{
对象[]数组=((数组)值).Cast().ToArray();
string[]strings=Array.ConvertAll(数组,item=>item.ToString());
// ...
}
}
我想这没关系,但它看起来很复杂。有没有更简单的方法?您不需要将其转换为数组,然后使用LINQ。您可以以更为流式的方式进行操作,只需在最后转换为阵列:
var strings = ((IEnumerable) value).Cast<object>()
.Select(x => x == null ? x : x.ToString())
.ToArray();
var strings=((IEnumerable)值).Cast()
.Select(x=>x==null?x:x.ToString())
.ToArray();
(请注意,这将保留空值,而不是引发异常。对于任何
IEnumerable
,而不仅仅是数组,这也很好。)。ToArray
在中进行多个内存分配,但有几种解决方法:
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]);
下面的解决方案在JAVA中
公共静态对象[]ConvertObjectToObject数组(){
Objects firstObject=新对象();
返回新对象[]{firstObject};
}
在上面的返回语句中,您正在将一个对象转换为一个对象数组。看起来不错。你还想要什么?数组总是很复杂的。通用列表更容易使用。:)我认为林克的演员阵容不使用拳击。这是真的吗?如果是这样的话,我们在转换某些类型时就不会有任何问题吗?@LuisFilipe:是的,它有拳击功能。它不会从(比如说)
byte
转换到int
,但它会装箱。@JonSkeet:为什么Linq的Cast不能从byte转换到int。根据我的研究,这不是自定义转换(至少它不会出现在VS元数据中)。也许这太离题了…@LuisFilipe:在.NET3.5SP1之前,它确实做到了。但现在它基本上对T
-进行了转换,并且假设该值是一个装箱的字节
,尝试将其解装箱到int
将失败…@JonSkeet:感谢您的启发;尽管我需要阅读文献才能完全理解它。我的问题特别拒绝了(object[])value
,因为可能存在运行时错误。对不起,不是“…value可能是几种数组类型之一,如int[]
或string[]
。”在这两种情况下,使用“as”的初始转换都将失败。没有异常,但数组
将为空。数组类型不是协变的。(比双向飞碟更好?)谢谢@MarcL。像往常一样,我没有仔细阅读这个问题,我想到了Interop.Excel中的动态对象[,]
数组
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]);
string[] strings = (value as Array)?.Cast<object>().Select(Convert.ToString).ToArray();