У объектов тип разный - string или string[], их невозможно поместить в один массив напрямую. Но можно сделать по другому - по сложному или по простому.
Сложный - сделать отдельный тип, который принимает либо строку, либо коллекцию объектов такого же типа. И теперь в коллекцию таких типов можно поместить иерархично.
А можно по простому - просто использовать массив объектов. И строка, и массив строк - объекты. Но придётся явно проверять реальный тип.
object[] arr = new object[]
{
"Hello World!",
new object[]
{
"Hello_1",
"Hello_2"
}
};
foreach (object item in arr)
{
if (item is string str)
{
Console.WriteLine(str);
}
else if (item is object[] subarr)
{
foreach (object subitem in subarr)
{
Console.WriteLine(subitem);
}
}
}
Если в требуемом массиве нужно всего лишь два уровня, то так будет работать. Но если нужно сделать многомерный массив неизвестной размерности, то придётся использовать рекурсию:
object[] arr = new object[]
{
"Hello World!",
new object[]
{
"Hello_1",
"Hello_2",
new object[]
{
"Hello_11",
"Hello_22"
}
}
};
foreach (object item in arr)
{
ItemAction(item, str => Console.WriteLine(str));
}
static void ItemAction(object item, Action<string> action)
{
if (item is string str)
{
action(str);
}
else if (item is object[] arr)
{
foreach (object subitem in arr)
{
ItemAction(subitem, action);
}
}
}