如何在C#中的单个数组中添加不同类型的对象?

时间:2011-06-26 05:35:20

标签: c# .net arrays

我打算用C#重写我的Python Tile Engine。它使用所有游戏对象的列表并在屏幕上呈现它们。我的问题是,与Python不同,你几乎可以向数组添加任何内容(例如x = ["jj" , 1, 2.3, 'G', foo]),你只能添加一种类型的对象 在C#数组(int[] x = {1,2,3};)中。是否有任何动态数组(类似于ArrayList()类)或允许您将不同类型打包到单个数组中的东西?因为所有游戏对象都是单独的类。

11 个答案:

答案 0 :(得分:36)

非常简单 - 创建一个Object类数组并为数组赋值。

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

答案 1 :(得分:14)

您可以使用object数组。 stringsintboolclasses都被视为对象,但确实意识到每个对象都不会保留曾经的对象,因此您需要知道对象实际上是一个字符串,或某个类。然后,您可以将对象转换为该类/数据类型。

示例:

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#的游戏框架(没有它作为标签,所以我假设你没有使用它)。

答案 2 :(得分:12)

您可以编写一个名为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();
    }
}

答案 3 :(得分:7)

C#有一个ArrayList,允许你在一个数组中混合类型,或者你可以使用一个对象数组,object []:

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

答案 4 :(得分:3)

在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;

答案 5 :(得分:2)

您可以使用object[](对象数组),但使用List<object>会更灵活。它满足了你的要求,可以添加任何类型的对象,就像数组一样,它可以通过数字索引访问。

使用List的优点是您不需要知道创建它时它将保留的项目。它可以动态增长和缩小。此外,它还有一个更丰富的API来处理它包含的项目。

答案 6 :(得分:2)

以下是如何做到这一点

使用List<object>(因为所有内容都是从C#中的对象派生的):

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 article

但你需要吗?

C#是一种强类型且非常可靠的编程语言。它非常灵活,非常适合使用面向对象和功能范例构建应用程序。你想做的事情对于python来说可能是可以接受的,但在C#上看起来很糟糕。我的建议是:使用面向对象的编程并尝试为您的问题构建模型。永远不要像你试过的那样混合类型。一个列表用于单个数据类型。您想深入描述您的问题,以便我们建议您提供更好的解决方案吗?

答案 7 :(得分:1)

在C#4和更高版本中,您还可以使用动态类型。

dynamic[] inputArray = new dynamic[] { 0, 1, 2, "as", 0.2, 4, "t" };

Official docu

答案 8 :(得分:0)

您必须使用数据类型object声明数组:

object[] myArray = { };

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

答案 9 :(得分:0)

您可以使用对象类的数组,并可以在数组中添加不同类型的对象。

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

答案 10 :(得分:0)

您可以通过以下方式混合特定类型:

(string, int)[] Cats = { ("Tom", 20), ("Fluffy", 30), ("Harry", 40), ("Fur Ball", 40) };
            
            foreach (var cat in Cats)
            {
                Console.WriteLine(string.Join(", ", cat));
            }