object to string array

I am trying to convert an object (is declared here as 'obj': object is array, primitive) to a string array.

object can be anything uint[], int16[], etc.

I have been trying to use

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

The problem occurs when I try to cast the unknown type object into object[]. I have been getting casting error.

One attempt I made, which failed, was using

object[] arr = (object[])obj;

or

IEnumerable<object> list = obj as IEnumerable<object>
object[] arr = (object[])list;

I saw postings regarding value type and reference type issue on casting.

Would there be a simple code that can handle casting to object[] regardless of type of object, as long as it is an array ? I am trying to avoid manual handling of every possible type casting.

1

3 Answers

You can use the fact that every array implements IEnumerable:

string[] arr = ((IEnumerable)obj).Cast<object>() .Select(x => x.ToString()) .ToArray();

This will box primitives appropriately, before converting them to strings.

The reason the cast fails is that although arrays of reference types are covariant, arrays of value types are not:

object[] x = new string[10]; // Fine
object[] y = new int[10]; // Fails

Casting to just IEnumerable will work though. Heck, you could cast to Array if you wanted.

10

If it's always a collection of some type (array, list, etc ...) then try casting back to plain old System.Collections.IEnumerable and go from there

string[] str = ((System.Collections.IEnumerable)obj) .Cast<object>() .Select(x => x.ToString()) .ToArray();

Here is a more thorough implementation that handles non-collections as well

static string[] ToStringArray(object arg) { var collection = arg as System.Collections.IEnumerable; if (collection != null) { return collection .Cast<object>() .Select(x => x.ToString()) .ToArray(); } if (arg == null) { return new string[] { }; } return new string[] { arg.ToString() };
}
0

my example:

 public class TestObject { public string Property1 { get; set; } public string Property2 { get; set; } public string Property3 { get; set; } } static void Main(string[] args) { List<TestObject> testObjectList = new List<TestObject> { new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }, new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }, new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" } }; List<string[]> convertedTestObjectList = testObjectList.Select(x => new string[] { x.Property1, x.Property2, x.Property3 }).ToList(); }

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

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

You Might Also Like