按Id排序数组元素并删除Unity / C中的特定元素#

时间:2018-03-07 08:31:20

标签: c# unity3d

我有一个数组存储游戏中的所有关卡。此数组搜索所有级别和

  • 按照他们的levelId
  • 命令他们
  • 删除已锁定的级别

所以我去找这个代码

private Level[] levels;

private void Start()
{
    levels = FindObjectsOfType<Level>(); // find all levels
    levels = levels.OrderBy(currentLevel => currentLevel.Id).ToArray(); // order the array by levelId

    levels = levels.Where(currentLevel => currentLevel.IsUnlocked).ToArray(); // remove the locked levels from the array
}

有没有更好的方法来订购数组并删除锁定的级别?

3 个答案:

答案 0 :(得分:3)

您可以将thoose查询合并到一个语句中。

levels = FindObjectsOfType<Level>()
.Where(t=> t.IsUnlocked)
.OrderBy(currentLevel => currentLevel.Id)
.ToArray();

答案 1 :(得分:1)

您应该将其压缩为单个LINQ查询表达式:

levels = (from level in FindObjectsOfType<Level>()
          orderby level.Id
          where level.IsUnlocked
          select level).ToArray();

这看起来更整洁,读起来非常自然。

如果您之前没有遇到过这些查询表达式,可以阅读它们here

答案 2 :(得分:1)

让我们这样说吧: 我们希望找到所有解锁的级别并按 Id 进行排序,如果我们可能只需要其中几个级别,则无需对整个级别进行排序。

还值得一提的是.ToArray()强制立即进行查询评估并返回一个新数组。

您可能希望按照以下方式执行以下操作:

levels = 
     FindObjectsOfType<Level>()
     .Where(currentLevel => currentLevel.IsUnlocked)
     .OrderBy(currentLevel => currentLevel.Id)
     .ToArray();