49

I have a System.Array that I need to convert to string[]. Is there a better way to do this than just looping through the array, calling ToString on each element, and saving to a string[]? The problem is I don't necessarily know the type of the elements until runtime.

1
  • Without knowing the types until runtime, you essentially need to iterate over the array (be it with LINQ or whatever method). Commented Dec 28, 2009 at 18:10

5 Answers 5

74

How about using LINQ?

string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray();
Sign up to request clarification or add additional context in comments.

8 Comments

I don't seem to have access to the .Select method from my Array. Am I missing something?
Yes, add System.Linq to your using
Make sure you are using C# 3, and that you've included the System.Linq namespace.
I have System.Linq in my using statements. Here is the error message I get: Error 1 'System.Array' does not contain a definition for 'Select' and no extension method 'Select' accepting a first argument of type 'System.Array' could be found (are you missing a using directive or an assembly reference?)
@Craig, TheHurt, and LBushkin: System.Array doesn't implement IEnumerable<T>, so most LINQ extensions won't work. There is, however, an OfType<T> extension method on IEnumerable (which System.Array does implement), so it would have to be string[] foo = someArray.OfType<object>().Select(o=>o.ToString()).ToArray();.
|
14

Is it just Array? Or is it (for example) object[]? If so:

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

Note than any 1-d array of reference-types should be castable to object[] (even if it is actually, for example, Foo[]), but value-types (such as int[]) can't be. So you could try:

Array a = ...
object[] arr = (object[]) a;
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString);

But if it is something like int[], you'll have to loop manually.

5 Comments

It is just Array and it could actually contain value types (probably will).
@KrisTrip - the variable might be "just Array", but the object won't be; it has a definite array type. There is also a big difference between "contain value types" (which object[] can do), and "is a value-type array" (such as int[]). This difference matters in this case. Can you clarify what exactly the Array instance is?
I get the Array by using a ToArray method. I don't know until runtime but it could be an int[], double[], float[], string[], or Complex[] (user defined object)
In that case, either you'll have to loop manually (like you are) or do some pretty messy reflection (MakeGenericMethod). The former would be preferable.
+1 for object[] arr = (object[]) a; as simple as it can be.
4

You can use Array.ConvertAll, like this:

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

Comments

2

Simple and basic approach;

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

Or just an another approach: You can use personNames.ToArray too:

string[] names = (string[]) personNames.ToArray(typeof (string));

1 Comment

The second approach looks cool and it was the 1st thing I tried but it does not exist in .NET 6.
0

This can probably be compressed, but it gets around the limitation of not being able to use Cast<> or Linq Select on a System.Array type of object.

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

1 Comment

Still an array of generic objects.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.