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<string[]> classesListCombined = new List<string[]> { 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<int[]> structListCombined = new List<int[]> { 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<T>(this IEnumerable<T> 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;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwp1c2luZyBTeXN0ZW0uVGV4dDsKCiAgICBjbGFzcyBQcm9ncmFtCiAgICB7CiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgIHsKICAgICAgICAgICAgLy9UZXN0IHdpdGggY2xhc3NlcwogICAgICAgICAgICBzdHJpbmdbXSBjbGFzc2VzTGlzdDEgPSBuZXdbXSB7ImEiLCAiYiIsICJjIn07CiAgICAgICAgICAgIHN0cmluZ1tdIGNsYXNzZXNMaXN0MiA9IG5ld1tdIHsgIjEiLCAiMiIsICIzIiB9OwogICAgICAgICAgICBMaXN0PHN0cmluZ1tdPiBjbGFzc2VzTGlzdENvbWJpbmVkID0gbmV3IExpc3Q8c3RyaW5nW10+IHsgY2xhc3Nlc0xpc3QxLCBjbGFzc2VzTGlzdDIgfTsKCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJjbGFzc2VzTGlzdDE6IHswfSIsIGNsYXNzZXNMaXN0MS5Kb2luKCkpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiY2xhc3Nlc0xpc3RDb21iaW5lZDogezB9IiwgY2xhc3Nlc0xpc3QxLkpvaW4oKSk7CgogICAgICAgICAgICAvL1Rlc3Qgd2l0aCBzdHJ1Y3RzCiAgICAgICAgICAgIGludFtdIHN0cnVjdExpc3QxID0gbmV3W10geyAxLCAyLCAzIH07CiAgICAgICAgICAgIGludFtdIHN0cnVjdExpc3QyID0gbmV3W10geyA0LCA1LCA2IH07CiAgICAgICAgICAgIExpc3Q8aW50W10+IHN0cnVjdExpc3RDb21iaW5lZCA9IG5ldyBMaXN0PGludFtdPiB7IHN0cnVjdExpc3QxLCBzdHJ1Y3RMaXN0MiB9OwoKCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzdHJ1Y3RMaXN0MTogezB9Iiwgc3RydWN0TGlzdDEuSm9pbigpKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInN0cnVjdExpc3RDb21iaW5lZDogezB9Iiwgc3RydWN0TGlzdENvbWJpbmVkLkpvaW4oKSk7CgogICAgICAgICAgICAvL1Rlc3QgdHJpcHBsZSBuZXN0aW5nCgogICAgICAgICAgICB2YXIgbmVzdDEgPSBuZXdbXSB7MSwgMiwgM307CiAgICAgICAgICAgIHZhciBuZXN0MiA9IG5ld1tdIHsgNCwgNSwgNiB9OwogICAgICAgICAgICB2YXIgbmVzdDMgPSBuZXdbXSB7IDcsIDgsIDkgfTsKICAgICAgICAgICAgdmFyIG5lc3Q0ID0gbmV3W10gezEwLCAxMSwgMTJ9OwoKICAgICAgICAgICAgdmFyIGxheWVyMSA9IG5ld1tdIHtuZXN0MSwgbmVzdDJ9OwogICAgICAgICAgICB2YXIgbGF5ZXIyID0gbmV3W10ge25lc3QzLCBuZXN0NH07CiAgICAgICAgICAgIHZhciB0b3AgPSBuZXdbXSB7bGF5ZXIxLCBsYXllcjJ9OwoKCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0b3A6IHswfSIsIHRvcC5Kb2luKCkpOwoKICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOwoKICAgICAgICB9CiAgICB9CgogICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4dGVuc2lvbk1ldGhvZHMKICAgIHsKICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luPFQ+KHRoaXMgSUVudW1lcmFibGU8VD4gZW51bWVyYWJsZSkKICAgICAgICB7CiAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICBKb2luSW50ZXJuYWwoZW51bWVyYWJsZSwgc2IsIHRydWUpOwogICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKICAgICAgICB9CgogICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSm9pbkludGVybmFsKElFbnVtZXJhYmxlIGVudW1lcmFibGUsIFN0cmluZ0J1aWxkZXIgc2IsIGJvb2wgZmlyc3QpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBlbnVtZXJhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FzdEl0ZW0gPSBpdGVtIGFzIElFbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgaWYgKGNhc3RJdGVtICE9IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBKb2luSW50ZXJuYWwoY2FzdEl0ZW0sIHNiLCBmaXJzdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmaXJzdDsKICAgICAgICB9CiAgICB9
classesList1: a,b,c
classesListCombined: a,b,c
structList1: 1,2,3
structListCombined: 1,2,3,4,5,6
top: 1,2,3,4,5,6,7,8,9,10,11,12