存储字符串和数组的列表

时间:2016-06-08 04:01:05

标签: c# unity3d

这是一种明智的做法吗?

所以我在我的类中创建了一个名为bankItemList的类,在其中我有一个字符串和一个int。

public List<bankItemList> listOfBankItems = new List<bankItemList>();
[Serializable]
public class bankItemList
{
    public int Stacks;
    public string Name;
    public bankItemList(string name, int amm)
    {
        Name = name;
        Stacks = amm;
    }
}

然后我使用一个小函数将项添加到List。

public bool addItemToBankArray(string name, int amm)
{
    foreach (bankItemList i in listOfBankItems)
    {
        if (i.Name == name)
        {
            i.Stacks += amm;
            return true;
        }
    }
    bankItemList item = new bankItemList(name, amm);
    listOfBankItems.Add(item);
    return true;
}

然后我使用另一个功能删除项目。

public void bankItemClicked(GameObject obj)
{
        listOfBankItems.RemoveAt(bankitems.IndexOf(obj));
        bankitems.Remove(obj);
        Destroy(obj);
}

当然,这仅限于核心功能。我主要要问的是,创建一个可序列化的类并将该类添加到列表中是一种存储字符串和相互“相关”的int的好方法。

2 个答案:

答案 0 :(得分:1)

代码看起来很好。只需要改变一些事情。开始使用首字母大写命名类/脚本。您的bankItemList应为BankItemList

重要

您必须将foreach循环更改为for循环。请勿使用foreach在当前版本Unity中循环Lists。它在每个循环中分配内存,性能很差。

您的新固定addItemToBankArray功能:

public bool `addItemToBankArray`(string name, int amm)
{
    for (int i =0; i<listOfBankItems.Count; i++ )
    {
        if (listOfBankItems[i].Name == name)
        {
            listOfBankItems[i].Stacks += amm;
            return true;
        }
    }

    bankItemList item = new bankItemList(name, amm);
    listOfBankItems.Add(item);
    return true;
}

答案 1 :(得分:1)

我可能会将所有用于存储BankItem对象的逻辑放在您自己的集合类中。这可能比使用辅助方法和另一个List漂浮在周围更好。最好将所有这些封装成一个类。

public class BankItem
{
    public int Stacks { get; set; }
    public string Name { get; set; }
    public BankItem(string name, int stacks)
    {
        Name = name;
        Stacks = stacks;
    }
}

public class BankItemList
{
    private List<BankItem> bankItems = new List<BankItem>();

    public void AddItem(string name, int stacks)
    {
        BankItem i = bankItems.FirstOrDefault(bi => bi.Name == name);

        if(i != null)
            i.Stacks += stacks;
        else
            bankItems.Add(new BankItem(name, stacks));
    }

    public void RemoveItem(BankItem i)
    {
        bankItems.Remove(i);
    }
}