it-roy-ru.com

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

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

20
ApprenticeHacker

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

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

вы можете использовать массив 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]);

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

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

13
Ben

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

Правка:

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();
    }
}
11
Gilad Naaman

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

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

В c # мы используем массив 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;
3
Syeda

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

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

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

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

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

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

Но тебе это нужно?

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

2
Andrei

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

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

2
FishBasketGordo

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

object[] myArray = { };

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

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

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