簡體   English   中英

靜態列表中的項目 <Item> ()

[英]Items in static List<Item>()

因此,我有一個靜態項目列表,其中存儲了幾個類,這些類中有諸如“ int ID”,“ string name”,“ string description”,“ int currentAmount”等變量。

ItemDatabase.cs...

public static List<Item> Items

static void LoadItemData()
{
    Items.Add(new item);
    ...
}

然后,我有一個單獨的項目列表,其中將添加有項目供播放器使用。

Player.cs...

List<Item> playerItems;

然后在其他類中,我有AddItem(int ID)方法:

void AddItem(int id)
{
    foreach (Item i in ItemDatabase.Items)
        if (i.ID == id)
            playerItems.Add(i);
}

我目前正在添加將使用相同數據的實體。 但是,當我修改添加到playerItems的Item時,它修改了ItemDatabase.Items(顯然是由於引用)。

我不能使Item類成為一個結構,因為我還有其他派生自其的類。 我需要將“ currentAmount”整數作為值。 有什么辦法可以做到嗎?

PS,我已經嘗試了深度克隆,但在我的Item類中效果不佳。

您需要將currentAmount分開。 由於無論如何該值僅在Player上下文中才有意義,因此我將其從Item類中取出,並使用Dictionary<Item,int>來跟蹤庫存:

Dictionary<Item, int> inventory = new Dictionary<Item, int>();

void AddItem(int id)
{
    foreach (Item i in ItemDatabase.Items)
        if (i.ID == id)
            playerItems.Add(i, 0); //Or whatever count
}

顯然,如果要更改對象而不影響原始對象,則需要克隆對象。 序列化是進行“深度克隆”的一種方法,但是您發現並非所有類型都可以序列化。

如果僅修改第一級值類型屬性(不更改相關項目的值或引用),則可以使用object.MemberwiseClone來創建淺表副本(值類型和引用的副本)。

我仍然不確定在哪里修改ItemsDatabase.Items(currentAmount作為Entity屬性沒有多大意義),但是對於庫存中的當前金額,我想這將對您有所幫助:

Dictionary<Item, int> inventory = new Dictionary<Item, int>();

void AddItem(int id)
{
    foreach (Item i in ItemDatabase.Items)
        if (i.ID == id)
            {
              if(!inventory.Keys.Contains(i)){iventory.Add(i, 0);}
              inventory[i]+=1; //increment the amount of items in inventory.
            }
}

重要:

字典使用哈希從字典中獲取對象,因此,您可能想在Item類中重寫該方法:

class Item {
    public string Name;
    public string Description;
    public int currentAmount;

    public override int GetHashCode(){
       return Name.GetHashCode() + Description.GetHashCode();
    }
}

查看更多:

做這個:

void AddItem(int id)
{
    var item = ItemDatabase.Items.FirstOrDefault(x=> x.ID == id);
    if(item!=null){
        playerItems.Add(new Item(){ ID = item.ID, Name = item.Name, etc... })
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM