Unity 3d中的内存排序列表?

问题描述 投票:0回答:1

编辑说错误:内存不足。大家好,我正在学习排序列表。 PrintMessage方法每秒运行一次。而添加功能正在导致错误。您能否根据代码打击判断出错了什么?谢谢。

void PrintMessage(GameObject gameObject) {
    Target newTarget = new Target(gameObject, transform.position);
    targets.Add(newTarget);
    print(targets[targets.Count-1].Distance.ToString());
}

public void Add(T item)
{
    int num;
    // add your implementation below
    if (items.Count != 0)
    {
        for (int i = 0; i < items.Count; i++)
        {
            num = item.CompareTo(items[i]);
            if (num >= 0)
            {
                tempList.AddRange(items.GetRange(i, items.Count - i));
                items.RemoveRange(i, items.Count - i);
                items.Add(item);
                items.AddRange(tempList);
                tempList.Clear();
                continue;
            }
        }
        items.Add(item);
    }
    else
    {
        items.Add(item);
    }
}
list unity3d out-of-memory sortedlist
1个回答
1
投票

问题在于内部

for (int i = 0; i < items.Count; i++)
{
    ...
    items.Add(item);
    ...
}

你不断添加越来越多的物品。因此,items.Count循环的每次迭代都将是+1项更大=>退出条件i >= items.Count永远不会被满足。

&右箭头;迭代同一个列表时,切勿更改列表计数!

最后的原因是你正在使用continue(转到下一次迭代)..它没有任何意义,因为此时无论如何下一次迭代将开始。

你可能会调整break(中断循环)甚至return,因为无论如何你再次调用items.Add(item) ...


您可能更愿意使用List<T>.Insert(int index, T item)

public void Add(T item)
{
    int newIndex = 0;

    // You don't need an additional if-else
    // since this loop is anyway never executed
    // if (items.Count == 0)
    for (int i = 0; i < items.Count; i++)
    {
        num = item.CompareTo(items[i]);
        if (num >= 0)
        {
            // we want to add the new item AFTER
            // the item we compared it to
            newIndex = i+1;
            return;
        }
    }

    // Inserts the item at index newIndex
    // if newIndex == items.Count this equals Add
    items.Insert(newIndex, item);
}

请注意,这实际上已经存在!

它被称为SortedSet<T>

© www.soinside.com 2019 - 2024. All rights reserved.