检查列表是否包含相同项目的特定金额时间

时间:2018-02-12 16:44:42

标签: c# unity3d unity5 unityscript

所以我有一个列表,其中我将gameObjects与特定的标签和名称放在一起。我需要知道列表是否包含同一对象的多个副本。

我想出的解决方案可能过于复杂而且不好,但现在是:

让我们说我需要知道列表是否包含此游戏对象的3个副本。我会有一个for循环,我将检查列表是否包含此对象(名称,标签等),我会将此对象放入临时变量,而不是从列表中销毁(删除)此对象,然后继续检查列表是否包含另一个和第3个gameObject。

所有都将被分配给唯一变量,如果我愿意,例如,只找到2个副本,我会将这些被破坏的对象添加回列表,当然,停止循环。

我希望这是可以理解的

1 个答案:

答案 0 :(得分:2)

这很棘手但可以在Dictionary上循环List时完成。

这是该怎么做:

1 。创建Dictionary来保存对象。 应该是Object的类型。就我而言,我将使用GameObject应为int。该int将表示GameObject中出现List的次数。

2 。覆盖包含要检查的所有游戏对象的列表。

3 。在每个循环中,检查字典中是否存在#2 中当前循环的Object。

如果它存在于字典中,将检索该值,然后将其递增1 。如果字典中不存在,将当前GameObject添加到值为1 的字典中。

4 。最后,通过将目标特定金额(3)与字典中的值进行比较,检查我们是否已达到字典中的x金额。打破循环这是真的,否则继续循环直到结束。

以上所有内容都转换为函数。有关详细信息,请参阅评论:

bool listConstainsSpecificObjCount(List<GameObject> targetObjList, GameObject targetObj, int appearedCount)
{
    bool containsSpecificObjCount = false;

    //1 Dictionary to hold the object found in each loop
    Dictionary<GameObject, int> tempDic = new Dictionary<GameObject, int>();

    //2 Loop over the targetObjList
    for (int i = 0; i < targetObjList.Count; i++)
    {
        //Current Object in the Loop
        GameObject currentDicObj = targetObjList[i];

        int dicResult = 0;

        //3 Check if the Object from the current loop exist in the dictionary
        if (tempDic.TryGetValue(currentDicObj, out dicResult))
        {
            //It exists, increment the count by 1
            dicResult++;

            //Update data/value in the existing Dictionary
            tempDic[currentDicObj] = dicResult;
        }
        else
        {
            //Use 1 for the value because we are about to add it to the Dictionary
            dicResult = 1;

            //Add current Object to the Dictionary for the first time
            tempDic.Add(currentDicObj, dicResult);
        }

        //4 Check if we have reached that x amount in the dictionray then break out of the loop
        if (dicResult >= appearedCount)
        {
            containsSpecificObjCount = true;
            break;
        }
    }
    return containsSpecificObjCount;
}

<强> USAGE

//The list of the Objects to check if they appeared x amount of time
public List<GameObject> testList;
//The specific Object to check 
public GameObject objToCheck;
//The X amount of time it should check if it appeared
int specificCount = 3;

void Start()
{
    bool result = listConstainsSpecificObjCount(testList, objToCheck, specificCount);
    Debug.Log(result);
}

如果您想改进此功能,请将Dictionary<GameObject, int> tempDic = new Dictionary<GameObject, int>();移到该功能之外,以便每次调用时都会创建新的Dictionary 。使用tempDic.Clear();清除该函数开头的字典。