web-dev-qa-db-fra.com

Comment ajouter différents types d'objets dans un seul tableau en C #?

Je prévois de réécrire mon moteur de tuiles Python en C #. Il utilise une liste de tous les objets du jeu et les rend à l'écran. Mon problème est que contrairement à Python où vous pouvez ajouter presque n'importe quoi dans un tableau (par exemple x = ["jj", 1, 2.3, 'G', foo]), vous ne pouvez ajouter qu'un seul type d'objets. array (int [] x = {1,2,3};). Existe-t-il des tableaux dynamiques (similaires à la classe ArrayList ()) ou quelque chose qui vous permet de regrouper différents types dans un seul tableau? parce que tous les objets du jeu sont des classes individuelles.

20
ApprenticeHacker

Très simple: créez un tableau de classe Object et assignez n'importe quoi à ce tableau.

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

vous pouvez utiliser un tableau object. strings, int, bool et classes sont tous considérés comme des objets, mais réalisez que chaque objet ne conserve pas ce qu'il était autrefois. Vous devez donc savoir qu'un objet est en fait une chaîne ou une classe. Ensuite, vous pouvez simplement convertir l'objet dans cette classe/ce type de données.

Exemple:

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

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

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

Bien que C # soit un langage fortement typé, je vous recommande donc d’accepter les différences de langage. Peut-être devriez-vous regarder comment vous pouvez refactoriser votre moteur pour utiliser une dactylographie puissante, ou chercher d'autres moyens de partager les différentes classes, etc. J'aime personnellement la façon dont C # le fait, cela me fait gagner beaucoup de temps sans avoir à me soucier des données types, etc. parce que C # jettera toutes les erreurs de transtypage (changement d’un type de données en un autre) dans mon code avant l’exécution.

En outre, si vous ne le saviez pas, xna est le framework de jeu de C # (ne l’avait pas sous forme de tag, donc je suppose que vous ne l’utilisez pas).

13
Ben

Vous pouvez écrire une classe de base abstraite appelée GameObject et la faire hériter par tous les gameObject.

Modifier:

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 # a une liste de tableaux qui vous permet de mélanger des types dans un tableau, ou vous pouvez utiliser un tableau d'objets, objet []:

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

En c #, nous utilisons un tableau object [] pour stocker différents types de données dans chaque emplacement d'élément.

  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

Voici comment vous pouvez le faire

Utilisez List<object> (comme tout est dérivé d'objet en C #): 

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

De plus, dynamic pourrait fonctionner pour vous (et votre arrière-plan python)

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

Si vous ne voulez pas utiliser dynamic, vous devez vraiment savoir ce que vous faites. Veuillez lire ceci Article MSDN avant de commencer.

Mais en as-tu besoin?

C # est un langage de programmation très typé et très solide. Il est très flexible et idéal pour créer des applications utilisant des paradigmes fonctionnels et orientés objet. Ce que vous voulez faire peut être acceptable pour Python, mais semble très mal en C #. Ma recommandation est la suivante: utilisez la programmation orientée objet et essayez de construire un modèle pour votre problème. Ne mélangez jamais les types comme vous l'avez essayé. Une liste est pour un seul type de données. Souhaitez-vous décrire votre problème en profondeur afin que nous puissions vous proposer une meilleure solution?

2
Andrei

Vous pouvez utiliser object[] (un tableau d'objets), mais il serait plus flexible d'utiliser List<object>. Cela répond à votre exigence selon laquelle tout type d'objet peut y être ajouté et, comme un tableau, il est accessible via un index numérique.

L'avantage d'utiliser une liste est que vous n'avez pas besoin de savoir comment les éléments seront conservés lorsque vous le créez. Il peut croître et se réduire de manière dynamique. En outre, il dispose d'une API plus riche pour manipuler les éléments qu'il contient.

2
FishBasketGordo

Vous devez déclarer votre tableau avec le type de données object:

object[] myArray = { };

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

Vous pouvez utiliser un tableau de classe d'objets et tout ce qui est possible pour ajouter différents types d'objets dans un tableau.

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