C# 将System.Array转换为字符串[]

C# 将System.Array转换为字符串[],c#,.net,arrays,system.array,C#,.net,Arrays,System.array,我有一个需要转换为字符串[]的System.Array。有没有比在数组中循环、在每个元素上调用ToString并保存为字符串[]更好的方法呢?问题是直到运行时我才知道元素的类型。使用LINQ怎么样 string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray(); 只是数组吗?或者是对象[]的示例?如果是: 但如果是int[],则必须手动循环。可以使用Array.Conver

我有一个需要转换为字符串[]的System.Array。有没有比在数组中循环、在每个元素上调用ToString并保存为字符串[]更好的方法呢?问题是直到运行时我才知道元素的类型。

使用LINQ怎么样

string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray();
只是数组吗?或者是对象[]的示例?如果是:

但如果是int[],则必须手动循环。

可以使用Array.ConvertAll,如下所示:

string[] strp = Array.ConvertAll<int, string>(arr, Convert.ToString);

这可能是可以压缩的,但它绕过了无法在System.Array类型的对象上使用Cast或Linq Select的限制

Type myType = MethodToGetMyEnumType();
Array enumValuesArray = Enum.GetValues(myType);
object[] objectValues new object[enumValuesArray.Length];
Array.Copy(enumValuesArray, objectValues, enumValuesArray.Length);

var correctTypeIEnumerable = objectValues.Select(x => Convert.ChangeType(x, t));

简单和基本的方法

Array personNames = Array.CreateInstance(typeof (string), 3);
// or Array personNames = new string[3];
personNames.SetValue("Ally", 0);
personNames.SetValue("Eloise", 1);
personNames.SetValue("John", 2);

string[] names = (string[]) personNames; 
// or string[] names = personNames as string[]

foreach (string name in names)
    Console.WriteLine(name);
或者只是另一种方法:也可以使用personNames.ToArray:


在运行时之前不知道类型,您基本上需要在数组上进行迭代,无论是使用LINQ还是其他方法。我似乎无法从数组中访问.Select方法。我遗漏了什么吗?是的,将System.Linq添加到您的using确保您使用的是C3,并且您已经包含System.Linq命名空间。我的using语句中有System.Linq。下面是我收到的错误消息:错误1“System.Array”不包含“Select”的定义,并且找不到接受“System.Array”类型的第一个参数的扩展方法“Select”。是否缺少using指令或程序集引用?@Craig、Theheart和LBushkin:System。Array未实现IEnumerable,所以大多数LINQ扩展都不起作用。然而,在IEnumerable上有一个of type扩展方法,System.Array确实实现了该方法,因此它必须是string[]foo=someArray.of type.Selecto=>o.ToString.ToArray;。它只是一个数组,它实际上可能包含值类型,但变量可能只是数组,而对象可能不是;它有一个确定的数组类型。对象[]可以执行的包含值类型与int[]等值类型数组之间也有很大的区别。这种差异在这种情况下很重要。你能澄清数组实例到底是什么吗?我使用ToArray方法获得数组。直到运行时我才知道,但它可能是int[]、double[]、float[]、string[]或Complex[]用户定义的对象。在这种情况下,要么像现在这样手动循环,要么执行一些非常混乱的反射MakeGenericMethod。前者更可取。+1表示对象[]arr=对象[]a;尽可能简单。仍然是通用对象的数组。
Type myType = MethodToGetMyEnumType();
Array enumValuesArray = Enum.GetValues(myType);
object[] objectValues new object[enumValuesArray.Length];
Array.Copy(enumValuesArray, objectValues, enumValuesArray.Length);

var correctTypeIEnumerable = objectValues.Select(x => Convert.ChangeType(x, t));
Array personNames = Array.CreateInstance(typeof (string), 3);
// or Array personNames = new string[3];
personNames.SetValue("Ally", 0);
personNames.SetValue("Eloise", 1);
personNames.SetValue("John", 2);

string[] names = (string[]) personNames; 
// or string[] names = personNames as string[]

foreach (string name in names)
    Console.WriteLine(name);
string[] names = (string[]) personNames.ToArray(typeof (string));