object to string array
C#C# 4.0C# 3.0C# Problem Overview
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.
thanks in advance
C# Solutions
Solution 1 - C#
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.
Solution 2 - C#
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() };
}
Solution 3 - C#
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();
}