Подтвердить что ты не робот

Как добавить разные типы объектов в один массив в С#?

Я планирую переписать мой Python Tile Engine на С#. Он использует список всех игровых объектов и отображает их на экране. Моя проблема в том, что в отличие от Python, где вы можете добавить в массив почти все (например, x = ["jj", 1, 2.3, 'G', foo]), вы можете добавлять только один тип объектов в массив С# (int[] x = {1,2,3};). Существуют ли какие-либо динамические массивы (аналогичные классу ArrayList()) или что-то, что позволяет упаковывать разные типы в один массив? потому что все игровые объекты являются отдельными классами.

4b9b3361

Ответ 1

Очень просто - создайте массив класса Object и присвойте что-нибудь массиву.

Object[] ArrayOfObjects = new Object[] {1,"3"}

Ответ 2

вы можете использовать массив object. strings, int, bool и classes все считаются объектами, но понимают, что каждый объект не сохраняет то, что когда-то было, поэтому вам нужно знать, что объект на самом деле является строкой или определенный класс. Затем вы можете просто передать объект в этот класс/тип данных.

Пример:

List<object> stuff = new List<object>();

stuff.add("test");
stuff.add(35);

Console.WriteLine((string)stuff[0]);
Console.WriteLine((int)stuff[1]);

Хотя, С# - строго типизированный язык, поэтому я бы рекомендовал вам использовать языковые различия. Возможно, вам стоит взглянуть на то, как вы можете реорганизовать ваш движок на использование сильного ввода текста или посмотреть другие способы совместного использования разных классов и т.д. Мне лично нравится, как С# делает это, избавляет меня от необходимости беспокоиться о данных типы и т.д., потому что С# будет бросать любые кастинги (меняющие один тип данных на другой) ошибки, которые у меня есть в моем коде до выполнения.

Кроме того, чтобы вы не знали, что xna - это каркас С# (не имел его как тега, поэтому я предполагаю, что вы его не используете).

Ответ 3

Вы можете написать абстрактный базовый класс с именем GameObject и сделать все gameObject Inherit it.

Edit:

public abstract class GameObject
{
        public GameObject();
}
public class TileStuff : GameObject
{
    public TileStuff()
    {

    }
}
public class MoreTileStuff : GameObject
{
    public MoreTileStuff()
    {

    }
}
public class Game
{
    static void Main(string[] args)
    {
        GameObject[] arr = new GameObject[2];
        arr[0] = new TileStuff();
        arr[1] = new MoreTileStuff();
    }
}

Ответ 4

С# имеет ArrayList, который позволяет смешивать типы внутри массива, или вы можете использовать массив объектов, объект []:

  var sr = new ArrayList() { 1, 2, "foo", 3.0 };
  var sr2 = new object[] { 1, 2, "foo", 3.0 };

Ответ 5

В С# мы используем массив object [] для хранения различных типов данных в каждом местоположении элемента.

  object[] array1 = new object[5];
//
// - Put an empty object in the object array.
// - Put various object types in the array.
// - Put string literal in the array.
// - Put an integer constant in the array.
// - Put the null literal in the array.
//
array1[0] = new object();
array1[1] = new StringBuilder("Initialized");
array1[2] = "String literal";
array1[3] = 3;
array1[4] = null;

Ответ 6

Вы можете использовать object[] (массив объектов), но было бы более гибким использовать List<object>. Он удовлетворяет вашим требованиям, что к нему можно добавить любой объект, и, как массив, к нему можно получить доступ через числовой индекс.

Преимущество использования списка заключается в том, что вам не нужно знать, как элементы будут удерживаться при его создании. Он может расти и сжиматься динамически. Кроме того, он имеет более богатый API для управления содержащимися в нем элементами.

Ответ 7

Вот как вы можете это сделать

Используйте List<object> (поскольку все происходит от объекта в С#):

var list = new List<object>();
list.Add(123);
list.Add("Hello World");

Также dynamic может работать для вас (и вашего фона на python)

var list = new List<dynamic>();
list.Add(123);
list.Add(new
{
    Name = "Lorem Ipsum"
});

Если вы не используете dynamic, вам действительно нужно знать, что вы делаете. Перед тем, как начать, прочитайте эту статью MSDN.

Но вам это нужно?

С# - строго типизированный и очень прочный язык программирования. Он очень гибкий и удобен для создания приложений с использованием объектно-ориентированных и функциональных парадигм. То, что вы хотите сделать, может быть приемлемым для python, но выглядит довольно плохо на С#. Моя рекомендация: используйте объектно-ориентированное программирование и попытайтесь создать модель для своей проблемы. Никогда не смешивайте типы вместе, как вы пробовали. Один список предназначен для одного типа данных. Вы хотите подробно описать свою проблему, чтобы мы могли предложить вам лучшее решение?

Ответ 8

Вы должны объявить свой массив с типом данных object:

object[] myArray = { };

myArray[0] = false;
myArray[1] = 1;
myArray[2] = "test";

Ответ 9

Вы можете использовать массив объектов класса и все возможное, чтобы добавлять различные типы объектов в массив.

object[] array = new object[3];
array[0] = 1;
array[1] = "string";
array[3] = 183.54;