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.
5 Answers
How about using LINQ?
string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray();
8 Comments
KrisTrip
I don't seem to have access to the .Select method from my Array. Am I missing something?
Craig Stuntz
Yes, add
System.Linq to your usingLBushkin
Make sure you are using C# 3, and that you've included the System.Linq namespace.
KrisTrip
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?)
P Daddy
@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();. |
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
KrisTrip
It is just Array and it could actually contain value types (probably will).
Marc Gravell
@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?KrisTrip
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)
Marc Gravell
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.PCoder
+1 for
object[] arr = (object[]) a; as simple as it can be.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
UchiTesting
The second approach looks cool and it was the 1st thing I tried but it does not exist in .NET 6.
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
Léon Pelletier
Still an array of generic objects.