object to string array

C#C# 4.0C# 3.0

C# 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();
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionswcraftView Question on Stackoverflow
Solution 1 - C#Jon SkeetView Answer on Stackoverflow
Solution 2 - C#JaredParView Answer on Stackoverflow
Solution 3 - C#S.HafnerView Answer on Stackoverflow