【问题标题】:Querying object without a given name查询没有给定名称的对象
【发布时间】:2017-09-07 14:55:07
【问题描述】:

我使用这样的 C# 行创建了一个对象列表:

gameObjects.Add(new Object());

我还制作了一个函数,可以在屏幕上打印游戏对象中包含的对象类型列表。

for(int i = 0; i < gameObjects.Count; i++)
  Console.WriteLine(gameObjects[i].GetType());

到目前为止一切顺利。但是,我在屏幕上打印的项目比游戏对象中应该出现的项目多,所以我一直在尝试找出一种方法来找出是否有任何条目是重复的,因为我在我的代码中找不到任何内容可能会在列表中创建额外的对象。如果我能打印出列表中每个对象的名称,那就太好了,但由于我没有给它们命名,我认为这是不可能的。还有什么其他东西可以将列表中的一个对象与我可以利用的另一个对象区分开来吗?由于它只是调试,我真的不想进入并确保每个对象都有一个名称。

谢谢!

编辑:

对于那些要求更多代码的人,我有一个函数可以将 staticObject 类型的对象添加到 gameObjects 列表中:

private void CreateStaticObject(Vector2 v2StaticObjectPosition)
        {
            Texture2D staticObjectTexture = Content.Load<Texture2D>(@"textures\StaticObject");
            GameInfo.gameInfo.gameObjects.Add(new StaticObject(staticObjectTexture, v2StaticObjectPosition, sbSpriteBatch));
        }

该列表包含在名为 GameInfo 的类中。每个 StaticObject 都继承自 Sprite 类,如果这很重要的话。

我还在列表中添加了一个 Player 对象,它继承自 StaticObject 类:

private void CreatePlayer(Vector2 v2PlayerPosition)
        {
            Texture2D playerTexture = Content.Load<Texture2D>(@"textures\Player1");
            player1 = new Player(playerTexture, v2PlayerPosition, sbSpriteBatch);
        }

然后我用这个打印出列表的内容:

for(int i = 0; i < GameInfo.gameInfo.gameObjects.Count; i++)
            {
                string sObjectString = string.Format("Game object {0} is a {1}", i, GameInfo.gameInfo.gameObjects[i].GetType());
                DrawWithShadow(sObjectString, new Vector2(10, 20 * i + 10));
            }

DrawWithShadow() 只是一个简单的方法,它可以很好地将屏幕上的文本格式化到所需位置。不幸的是,对于我通过调用 CreateStaticObject() 方法创建的每个对象,我的列表中都有两个条目。

【问题讨论】:

  • 查看更多代码真的很有帮助...
  • define "duplicates",你的意思是对同一个实例的两个引用吗?还是您的对象实际上包含一些可以使用的数据?
  • 重现您的问题的信息会很好。
  • 我在上面添加了更多代码。希望它会有所帮助。

标签: c# list names


【解决方案1】:

更新因为我很笨,ReferenceEquals 检查引用相等性。

您是否尝试过 Object.ReferenceEquals()?它会告诉你引用 a 和引用 b 是否指向同一个对象。

        var x = new object();

        var y = x;

        //This will print "true"
        Console.WriteLine(Object.ReferenceEquals(x,y));

如果你只是想从列表中过滤掉骗子,试试这个:

gameObjects = gameObjects.Distinct().ToList();

【讨论】:

    【解决方案2】:

    您可以使用GroupBy 通过引用相等来查找所有重复对象:

    var duplicateGroups = gameObjects.GroupBy(obj => obj).Where(g => g.Count() > 1);
    

    请注意,如果它们被覆盖,这将使用对象的 Equals + GetHashCode 方法。

    【讨论】:

      【解决方案3】:

      感谢大家的建议。但是我发现了我的问题的根源。我在 StaticObject 类的构造函数中有一行旧代码,它将任何创建的 StaticObject 添加到列表中。所以我将每个对象添加了两次。哦! :S

      【讨论】:

        猜你喜欢
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多