C # - Словарь, значение которого представляет собой список нескольких типов - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь создать класс "Блок" для пещерной игры с боковой прокруткой в ​​Unity 2D.Я ищу HashMap / Dictionary, ключом которого является и int (идентификатор блока), а значением является список нескольких типов, скажем, текстура блока (Tile), отображаемое имя (строка), hardness (int),или отношения с гравитацией (bool).

Я бы хотел, чтобы это работало так, но я знаю, что C # работает не так.

Dictionary<int, List<Tile, int, string, bool>> blockProperties;

Ответы [ 2 ]

4 голосов
/ 25 сентября 2019

Создайте структуру данных , которая будет содержать типы:

class BlockDescriptor 
{
    public Tile Tile { get; }
    public int Hardness { get;}
    public string DisplayName { get; }
    public bool HasGravity { get; }

    public BlockDescriptor(Tile tile, int hardness, string name, bool gravity)
    {
        Tile = tile;
        Hardness = hardness;
        DisplayName = name;
        HasGravity = gravity;
    }
}

Затем вы можете сохранить их в словаре:

Dictionary<int, BlockDescriptor> blockProperties = new Dictionary<int, BlockDescriptor>();
blockProperties.Add(0, new BlockDescriptor(/* Tile */, 1, "Block A", false);
blockProperties.Add(1, new BlockDescriptor(/* Tile */, 2, "Block B", true); 

В качестве альтернативы вы можете использовать tuple :

var blockProperties = new Dictionary<int, (Tile, int, string, bool)>();
blockProperties.Add(0, (/* Tile */, 0, "Block A", false));
blockProperties.Add(1, (/* Tile */, 1, "Block B", true));

Я рекомендую выбирать структуру данных, поскольку вы можете реализовать различные интерфейсы, такие как IEquatable, IEqualityComparer, чтобы влиять на поведение в запросах LINQ, контейнерах и т. Д. Кроме того,он предоставляет потенциал для различных свойств самоанализа (например, IsUnbreakable, HasTileWithTransparency) или методов (например, CalculateHardness)

0 голосов
/ 26 сентября 2019

Вы должны составить список объектов типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...