using System; using System.Collections; using System.Collections.Generic; using System.Text; class Program { static void Main(string[] args) { //Test with classes string[] classesList1 = new[] {"a", "b", "c"}; string[] classesList2 = new[] { "1", "2", "3" }; List classesListCombined = new List { classesList1, classesList2 }; Console.WriteLine("classesList1: {0}", classesList1.Join()); Console.WriteLine("classesListCombined: {0}", classesList1.Join()); //Test with structs int[] structList1 = new[] { 1, 2, 3 }; int[] structList2 = new[] { 4, 5, 6 }; List structListCombined = new List { structList1, structList2 }; Console.WriteLine("structList1: {0}", structList1.Join()); Console.WriteLine("structListCombined: {0}", structListCombined.Join()); //Test tripple nesting var nest1 = new[] {1, 2, 3}; var nest2 = new[] { 4, 5, 6 }; var nest3 = new[] { 7, 8, 9 }; var nest4 = new[] {10, 11, 12}; var layer1 = new[] {nest1, nest2}; var layer2 = new[] {nest3, nest4}; var top = new[] {layer1, layer2}; Console.WriteLine("top: {0}", top.Join()); Console.ReadLine(); } } internal static class ExtensionMethods { public static String Join(this IEnumerable enumerable) { StringBuilder sb = new StringBuilder(); JoinInternal(enumerable, sb, true); return sb.ToString(); } private static bool JoinInternal(IEnumerable enumerable, StringBuilder sb, bool first) { foreach (var item in enumerable) { var castItem = item as IEnumerable; if (castItem != null) { first = JoinInternal(castItem, sb, first); } else { if (!first) { sb.Append(","); } else { first = false; } sb.Append(item); } } return first; } }