Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中的单个数组中添加不同类型的对象?_C#_.net_Arrays - Fatal编程技术网

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

如何在C#中的单个数组中添加不同类型的对象?,c#,.net,arrays,C#,.net,Arrays,我计划用C#重写我的Python Tile引擎。它使用所有游戏对象的列表,并在屏幕上呈现它们。我的问题是,与Python中几乎可以向数组添加任何内容(例如x=[“jj”,1,2.3,'g',foo])不同,您只能添加一种类型的对象 在C#数组中(int[]x={1,2,3};)。是否有任何动态数组(类似于ArrayList()类)或允许您将不同类型打包到单个数组中的内容?因为所有游戏对象都是单独的类。非常简单,创建一个对象类数组,并为数组分配任何内容 Object[] ArrayOfObject

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

非常简单,创建一个对象类数组,并为数组分配任何内容

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

您可以使用
对象
数组<代码>字符串、
int
bool
都被认为是对象,但要意识到每个对象并不保留它曾经的样子,因此您需要知道对象实际上是字符串或某个类。然后您可以将对象强制转换为该类/数据类型

例如:

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

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

Console.WriteLine((string)stuff[0]);
Console.WriteLine((int)stuff[1]);
List stuff=newlist();
添加(“测试”);
增加(35);
Console.WriteLine((string)stuff[0]);
Console.WriteLine((int)stuff[1]);
不过,C#是一种强类型语言,因此我建议您接受这种语言的差异。也许你应该看看如何重构引擎以使用强类型,或者研究其他方法来共享不同的类,等等。我个人喜欢C#这样做的方式,这样我就不用担心数据类型等问题,因为C#会抛出任何类型转换(将一种数据类型更改为另一种数据类型)运行前代码中存在的错误

另外,encase您不知道,xna是C#的游戏框架(没有它作为标记,所以我假设您没有使用它)。

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

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

您可以使用
object[]
(对象数组),但使用
List
会更灵活。它满足了您的需求,即可以向其中添加任何类型的对象,并且与数组一样,可以通过数字索引访问它

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

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

您可以编写一个名为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();
    }
}
这是你可以做到的 使用
列表
(因为所有内容都是从C#中的对象派生的):

如果你不想使用
dynamic
,你真的需要知道你在做什么。请在开始之前读一下

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

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

object[] myArray = { };

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

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

object[] array = new object[3];
array[0] = 1;
array[1] = "string";
array[3] = 183.54;
在C#4及更高版本中,还可以使用动态类型

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

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

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

你是说像object[]x={1,“G”,2.3,'H'}?这行得通吗?@每个人的大多数答案都是正确的,但由于技术程序员是第一个给出正确答案的人,我在他的答案上打了钩。@我正在使用SFML.NET。我已经知道C++/SFML,所以它更简单。它是跨平台的,与MONO兼容。嗯,很高兴知道,xna是我个人的最爱,但如果跨平台对你来说很重要,那将是一个破坏者。你能在没有visual studio的情况下使用xna吗?@mazzzzz:“但要意识到,每个对象都不能保留它曾经的样子。”。事实并非如此。您可以使用它来确定基础数据类型:stuff[0].GetType().Name或.FullName。我相信您不应该试图将一种语言当作另一种语言来使用。语言的设计通常考虑到某种语用系统。Python程序员思考问题的方式与使用C语言的人不同。我喜欢这些差异;并建议,至少在最初阶段,你要接受一种新语言的思维方式,因为它会打开你解决问题的能力。使用强类型作为优势而不是麻烦就是一个例子。至于列表,你是对的,但它很容易转换为原始枚举。创建一个新类是你最明智的解决方案。比对象更好
dynamic[] inputArray = new dynamic[] { 0, 1, 2, "as", 0.2, 4, "t" };
(string, int)[] Cats = { ("Tom", 20), ("Fluffy", 30), ("Harry", 40), ("Fur Ball", 40) };
            
            foreach (var cat in Cats)
            {
                Console.WriteLine(string.Join(", ", cat));
            }