【发布时间】:2010-12-30 13:19:32
【问题描述】:
我有一个 System.Array,我需要将其转换为字符串 []。有没有比循环遍历数组、在每个元素上调用 ToString 并保存到 string[] 更好的方法?问题是我不一定知道元素的类型,直到运行时。
【问题讨论】:
-
直到运行时才知道类型,您基本上需要遍历数组(使用 LINQ 或任何方法)。
标签: c# .net arrays system.array
我有一个 System.Array,我需要将其转换为字符串 []。有没有比循环遍历数组、在每个元素上调用 ToString 并保存到 string[] 更好的方法?问题是我不一定知道元素的类型,直到运行时。
【问题讨论】:
标签: c# .net arrays system.array
简单而基本的方法;
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:
string[] names = (string[]) personNames.ToArray(typeof (string));
【讨论】:
这可能会被压缩,但它绕过了不能在 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.ConvertAll,像这样:
string[] strp = Array.ConvertAll<int, string>(arr, Convert.ToString);
【讨论】:
使用 LINQ 怎么样?
string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray();
【讨论】:
System.Linq 添加到您的using
System.Array 没有实现 IEnumerable<T>,因此大多数 LINQ 扩展都不起作用。然而,IEnumerable 上有一个 OfType<T> 扩展方法(System.Array 确实实现了),所以它必须是 string[] foo = someArray.OfType<object>().Select(o=>o.ToString()).ToArray();。
只是Array吗?还是(例如)object[]?如果是这样:
object[] arr = ...
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString);
请注意,任何一维引用类型数组都应该可以转换为object[](即使它实际上是Foo[]),但值类型(例如int[])不能是。所以你可以试试:
Array a = ...
object[] arr = (object[]) a;
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString);
但如果是 int[] 之类的,则必须手动循环。
【讨论】:
object[] 可以做到)和“是值类型数组”(例如 int[])之间也存在很大的区别。在这种情况下,这种差异很重要。你能澄清一下Array 实例究竟是什么吗?
MakeGenericMethod)。前者会更好。
object[] arr = (object[]) a; 尽可能简单。