【问题标题】:How to add different types of objects in a single array in C#?如何在 C# 中的单个数组中添加不同类型的对象?
【发布时间】:2011-06-26 05:35:20
【问题描述】:

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

【问题讨论】:

  • 创建一个新类是您最明智的解决方案。

标签: c# .net arrays


【解决方案1】:

非常简单——创建一个 Object 类的数组并将任何内容分配给该数组。

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

【讨论】:

  • 你的意思是像 object[] x = {1,"G",2.3,'H'}; ?这行得通吗?
  • @EVERYBODY 大多数答案都是正确的,但由于技术程序员是第一个给出正确答案的人,所以我勾选了他的答案。
【解决方案2】:

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

【讨论】:

  • @我正在使用 SFML .NET。我已经知道 C++/SFML,所以它更容易。并且它是跨平台的,并且与 MONO 兼容。
  • 嗯,很高兴知道,xna 是我个人最喜欢的,但如果跨平台对你很重要,那将是一个交易破坏者。
  • 你可以在没有 Visual Studio 的情况下使用 xna 吗?
  • @mazzzzz:“但要意识到每个对象都不会保留它曾经的样子”。这并不完全正确。您可以使用它来确定基础数据类型:stuff[0].GetType().Name 或 .FullName。
  • 我相信你不应该尝试使用一种语言,就好像它是另一种语言一样。语言通常在设计时考虑到某种语用系统。 Python 程序员思考问题的方式与使用 C# 的人不同。我喜欢这些差异;并建议,至少在最初,你接受一门新语言的思维方式,因为它会打开你解决问题的能力。使用强类型作为优势而不是麻烦就是一个例子。至于列表,您是对的,但它很容易转换为原始枚举。
【解决方案3】:

你可以写一个抽象的基类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();
    }
}

【讨论】:

  • 比对象好
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      你可以这样做

      使用List&lt;object&gt;(因为一切都源自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】:

        您可以使用object[](对象数组),但使用List&lt;object&gt; 会更灵活。它满足你的需求,可以添加任何类型的对象,并且像数组一样,可以通过数字索引访问。

        使用 List 的优点是您在创建它时不需要知道它将如何保存项目。它可以动态增长和收缩。此外,它还有更丰富的 API 用于操作它所包含的项目。

        【讨论】:

          【解决方案8】:

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

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

          Official docu

          【讨论】:

            【解决方案9】:

            您可以混合特定类型执行以下操作:

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

            【讨论】:

              【解决方案10】:

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

              object[] myArray = { };
              
              myArray[0] = false;
              myArray[1] = 1;
              myArray[2] = "test";
              

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                  猜你喜欢
                  • 2016-05-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-06-03
                  • 2020-06-04
                  • 2020-12-15
                  • 2018-04-04
                  • 1970-01-01
                  相关资源
                  最近更新 更多