【问题标题】:Need to change values in classes without changing its reference需要在不更改其引用的情况下更改类中的值
【发布时间】:2022-11-22 23:01:39
【问题描述】:

我目前正在制作一个应用程序,用于跟踪桌面游戏的玩家和怪物信息。

目前我有“怪物”课程。此类包含其名称、最大生命值、速度、攻击等信息。我设法创建了一个数据库,其中包含每种怪物的默认值。我目前需要做的是可以更改名称(Monster > Monster 1、Monster 2 等)、更改其 HP 和其他一些内容。

我知道我需要复制一份,但我不确定如何做。

我目前尝试的是以下内容:

 public class DatabaseService
    {
        public List<Player> Players { get; set; }
        public List<Monster> AllMonsters { get; set; }
        public List<Monster> ActiveMonsters = new List<Monster>();

        public bool RollForHP = false;

        //Main Database Service
        public DatabaseService()
        {
            Players = GetPlayers();
            AllMonsters = GetAllMonsters();
        }

        public void DoStuff()
        {
            AddMonsterByName("Goblin", 2);
            AddMonsterByName("Adult White Dragon", 1);
            AddMonsterByName("Duergar", 4);
            foreach (Monster monster in ActiveMonsters) { Console.WriteLine(monster.Name); }
        }

        //Converts the .json list with all players to Classes, which are then stored in the list "Players" if the "IsInParty" is true
        private List<Player> GetPlayers()
        {
            var path = @"C:\Users\MyName\source\repos\DndAdvancedInitiativeTracker\Logic\Database\Players.json";
            var json = File.ReadAllText(path);
            var players = JsonConvert.DeserializeObject<List<Player>>(json);
            List<Player> inPartyPlayers = new List<Player>();
            foreach (var player in players)
            {
                if (player.IsInParty == true) { inPartyPlayers.Add(player); }
            }
            return inPartyPlayers;
        }

        //Converts the .json list with all monsters to Classes, which are then stored in the list "AllMonsters"
        private List<Monster> GetAllMonsters()
        {
            var path = @"C:\Users\MyName\source\repos\DndAdvancedInitiativeTracker\Logic\Database\Monsters.json";
            var json = File.ReadAllText(path);
            var monsters = JsonConvert.DeserializeObject<List<Monster>>(json);
            return monsters;
        }

        
        //Adds a given monster to the "ActiveMonsters" list
        public void AddMonsterByName(string monsterName, int amountOfMonsters)
        {
            for (int i = 0; i < amountOfMonsters; i++)
            {
                List<Monster> DatabaseCopy = AllMonsters.Clone();
                DatabaseCopy = AllMonsters;
                Monster monster = DatabaseCopy.Find(x => x.Name == monsterName);
                Console.WriteLine(monster.Name);
                var number = CheckIfNameExistsInList(monsterName);
                monster.Name = monsterName + " " + (number + i).ToString();
                ActiveMonsters.Add(monster);
            }
        }

        private int CheckIfNameExistsInList(string monsterName)
        {
            var counter = 1;
            foreach (var monster in ActiveMonsters)
            {
                if (monster.Name.Contains(monsterName))
                {
                    counter += 1;
                }
            }
            return counter;
        }
    }

在“DoStuff”方法中,我尝试添加 2 个妖精,然后添加一条龙,然后再添加一个妖精。第一个 goblin 正确命名为“Goblin 1”,但第二个循环失败,因为 AllMonsters 的 goblins 名称现在是“Goblin 1”,因为引用类型,因此,从未找到 AllMonsters 中的第二个“Goblin”搜索,并返回空值。

【问题讨论】:

    标签: c# class reference


    【解决方案1】:

    我不确定你为什么要复制你的数据库(并且对 for 循环的每次迭代都这样做,这是非常浪费的),但你当前的检查代码 CheckIfNameExistsInList 将始终返回 1 即使没有匹配项名单。

    您可以简化您的 AddMonstersByName(并对以前的怪物条目进行简单检查),如下所示:

    public void AddMonstersByName(string name, uint number = 1)
    {
        var count = AllMonsters.Count(x => x.Name.Contains(name));
        for (var i = 1; i <= number; i++)
        {
            var num = count + i;
            AllMonsters.Add(new Monster(){Name= name+num.ToString()});
        }
    }
    

    这是在一个简单的控制台应用程序中测试的:

    var dataService = new DataService();
    dataService.AddMonstersByName("Goblin", 2);
    dataService.AddMonstersByName("Dragon", 2);
    dataService.AddMonstersByName("Goblin", 2);
    
    foreach (var monster in dataService.AllMonsters)
    {
        Console.WriteLine($"{monster.Name}");
    }
    

    在哪里

    public class DataService
    {
        public List<Monster> AllMonsters = new List<Monster>();
    
        public void AddMonstersByName(string name, uint number = 1)
        {
            var count = AllMonsters.Count(x => x.Name.Contains(name));
            for (var i = 1; i <= number; i++)
            {
                var num = count + i;
                AllMonsters.Add(new Monster(){Name= name+num.ToString()});
            }
        }
    }
    
    public class Monster
    {
        public string Name { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多