【问题标题】:Convert System.Array to string[]将 System.Array 转换为字符串 []
【发布时间】:2010-12-30 13:19:32
【问题描述】:

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

【问题讨论】:

  • 直到运行时才知道类型,您基本上需要遍历数组(使用 LINQ 或任何方法)。

标签: c# .net arrays system.array


【解决方案1】:

简单而基本的方法;

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));

【讨论】:

    【解决方案2】:

    这可能会被压缩,但它绕过了不能在 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));
    

    【讨论】:

    • 仍然是一个通用对象数组。
    【解决方案3】:

    你可以使用Array.ConvertAll,像这样:

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

    【讨论】:

      【解决方案4】:

      使用 LINQ 怎么样?

      string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray();
      

      【讨论】:

      • 我似乎无法从我的 Array 中访问 .Select 方法。我错过了什么吗?
      • 是的,将System.Linq 添加到您的using
      • 确保您使用的是 C# 3,并且您已包含 System.Linq 命名空间。
      • 我的 using 语句中有 System.Linq。这是我收到的错误消息:错误 1“System.Array”不包含“Select”的定义,并且找不到接受“System.Array”类型的第一个参数的扩展方法“Select”(您是否缺少使用指令还是程序集引用?)
      • @Craig、TheHurt 和 LBushkin:System.Array 没有实现 IEnumerable&lt;T&gt;,因此大多数 LINQ 扩展都不起作用。然而,IEnumerable 上有一个 OfType&lt;T&gt; 扩展方法(System.Array 确实实现了),所以它必须是 string[] foo = someArray.OfType&lt;object&gt;().Select(o=&gt;o.ToString()).ToArray();
      【解决方案5】:

      只是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[] 之类的,则必须手动循环。

      【讨论】:

      • 它只是一个数组,它实际上可以包含值类型(可能会)。
      • @KrisTrip - 变量 可能是“只是数组”,但对象不会;它有一个明确的数组类型。 “包含值类型”(object[] 可以做到)和“是值类型数组”(例如 int[])之间也存在很大的区别。在这种情况下,这种差异很重要。你能澄清一下Array 实例究竟是什么吗?
      • 我通过使用 ToArray 方法获取数组。直到运行时我才知道,但它可能是 int[]、double[]、float[]、string[] 或 Complex[](用户定义的对象)
      • 在这种情况下,你要么必须手动循环(就像你一样),要么做一些非常混乱的反射(MakeGenericMethod)。前者会更好。
      • +1 为object[] arr = (object[]) a; 尽可能简单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2019-10-10
      • 2016-06-28
      • 2019-01-05
      • 2015-01-18
      • 1970-01-01
      相关资源
      最近更新 更多