使用另一个方法调用列出RemoveAll

时间:2015-02-13 23:32:21

标签: c# linq unity3d

所以,我试图遍历一个列表并从列表中删除项目并销毁GameObject,所以起初我这样做了:

Pooler.Remove()

protected static void Remove(GameObject obj){
    PoolerItem p = (
        from item in pool
        where obj == item.gameObject
        select item
    ).FirstOrDefault();

    pool.Remove(p);
    GameObject.Destroy(p.gameObject);
}

循环列表

foreach(PoolerItem p in pool.Where(x => x.poolName == "cube")){
    if(totalItems > minPoolSize && p.inactiveLifeSpan > 0 && !p.gameObject.activeSelf && Time.time - p.disableTime >= p.inactiveLifeSpan){
        Pooler.Remove(p);
    }
}

我收到的错误基本上是您可以从正在循环的列表中删除项目

好的,有道理。所以我环顾四周,看到我应该使用RemoveAll所以我为此创建了代码,并将其替换为我的foreach:

pool.RemoveAll(
    p => p.poolName == entry.poolGroupName 
    && p.inactiveLifeSpan > 0 
    && !p.gameObject.activeSelf 
    && Time.time - p.disableTime >= p.inactiveLifeSpan
);

唯一缺少的是来自GameObject.Destroy(p.gameObject);的这一行Pooler.Remove。如何使用pool.RemoveAll()实现该功能?

1 个答案:

答案 0 :(得分:3)

您可以使用语句lambda而不是表达式,您可以在其中执行任何操作:

pool.RemoveAll(
p => { 
        if(p.poolName == entry.poolGroupName && 
           p.inactiveLifeSpan > 0 && 
           !p.gameObject.activeSelf  &&
           Time.time - p.disableTime >= p.inactiveLifeSpan)
        {
            GameObject.Destroy(p.gameObject);
            return true;
        }

        return false;
     });