将整个对象数组强制转换为字符串

20

我有一个类型为object的数组,其中存储的是字符串。我想将它们转换为字符串数组,最快的方法是什么?

例如:我有这个object[]数组,希望将其转换为string[]数组。

更新:我认为问题在于object[]中的某些对象实际上是其他对象,比如整数。我需要先将它们转换为字符串。请将此纳入您的解决方案。谢谢。


4
谈论“改变目标”的意思是修改要求或标准,以使旧的要求或标准无法满足。 - cristobalito
抱歉!我没有意识到那实际上是问题。 - Diskdrive
9个回答

16
object[] data = new object[] { "hello", "world", "!" };

string[] stringData = data.Cast<string>().ToArray();

如果您的对象数组包含混合元素,可以使用ArrayConvertAll方法:

object[] data = new object[] { "hello", 1, 2, "world", "!" };

string[] stringData = Array.ConvertAll<object, string>(data, o => o.ToString());

3
既然 Array 已经实现了一个转换方法,为什么还要使用 List 类的 ConvertAll 方法呢?请检查我的答案以了解如何正确地执行此操作。 - Jaroslav Jandek

16
string[] output = Array.ConvertAll(objects, item => item.ToString());

+1 提到了一个鲜为人知的方法。而且它可能比 LINQ 方法稍微更有效率。 - Thomas Levesque

12

可能不是最有效的方法...但它的好处在于在对象不一定是字符串时也可以工作。

string[] output = (from o in objectArray
                   select o.ToString()).ToArray()

1
为什么在您知道数组中的对象已经是字符串时还要调用 ToString?您只需要将项目强制转换为 string。此外,out 是一个保留关键字 ;) - Thomas Levesque
你需要将变量重命名为@out。 - James
@Thomas:谢谢您,调用ToString()方法使其可在一般情况下使用。结果看来,OP编辑了他的帖子说有些元素可以是非字符串数据类型(例如整数),所以这个方法仍然适用于这种情况。 - cristobalito
3
已经存在一种用于数组的转换方法(Array.ConvertAll),LINQ 只会让它变慢(例如:不是最快的方式-不适用于 CPU 或程序员)。 - Jaroslav Jandek
2
from ... select 语法很好,但是 objectArray.Select(o => o.ToString()).ToArray(); 实际上更加简洁。 - Peter Lillevold
显示剩余5条评论

3
string[] myStringArray = myObjectArray.Cast<string>().ToArray();

或者如果您正在使用var关键字:

var myStringArray = myObjectArray.Cast<string>();

如果你的字符串中有任何一个为null,使用Cast将不会抛出异常。


2
Cast<T>() 返回一个 IEnumerable<T>,你需要使用 ToArray() 来使其编译通过。 - Dirk Vollmar
@0xA3:是的,我更新了我的帖子。但是,如果OP使用var关键字,它不会抛出异常。 - James
1
请注意,使用 var 的版本可以编译,但会创建一个 IEnumerable<string> 而不是一个字符串数组。 - Dirk Vollmar

1
 object[] objects;
 ..
 string[] result = Array.ConvertAll(objects, 
        new Converter<object, string>(Obj2string));
 public static string Obj2string(object obj)
 {
    return obj.ToString();
 }

2
你可以使用lambda表达式:Array.ConvertAll(objects, o => o.ToString()); - onof

0
string[] str = new string[myObjects.Length];
for (int i = 0; i < myObjects.Length; ++i)
    str[i] = myObjects[i].ToString();

或:

List<string> lst = new List<string>();
foreach (object o in myObjects)
    list.Add(o.ToString());
return list.ToArray();

0

如果数组中的某些对象是整数,您不能使用Enumerable.Cast,否则在执行以下操作时会抛出InvalidCastException:

var list = new object[] { "1", 1 };

list.Cast<string>();

相反地,请尝试cristobalito的答案或者lambda语法的等价形式:

list.Select(o => o.ToString()).ToArray();

0

由于所有对象都已经是字符串,硬转换可以工作。更安全的方法可能是使用以下方法:

  private static void Conversions()
  {
     var strings = Convert(new object[] {"a", "b"});
     var strings2 = Convert(new object[] {});
  }

  private static string[] Convert(IEnumerable<object> objects)
  {
     return objects as string[] ?? new string[] {};
  }

该实现始终返回一个字符串数组,可能为空。可以基于这一假设实现客户端代码,从而避免需要检查返回值是否为 null。

0
object[] data = new object[] { "hello", "world", 1, 2 };

string[] strings = data.Select(o => o == null ? null : o.ToString()).ToArray();

有个疯狂的问题更新在那里...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接