@AlexGenesis

Как создать массив с разным количеством измерений?

Появилась задача создать что-то типо следующего массива:
{
      "Hello World!",
      {
            "Hello_1",
            "Hello_2"
      }
}

При этом он должен работать следующим образом:
Name_Of_Array[0];
>>> "Hello World!"
Name_Of_Array[1, 1];
>>> "Hello_2"

Можно ли и как(если можно) реализовать такой массив в C#? Буду благодарен за ответ, желательно с примером кода такого массива.
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
У объектов тип разный - 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);
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы