使用Linq按大小排序列表

时间:2016-09-19 13:26:47

标签: c# linq unity3d

我的代码现在:

 public GameObject[] Farms;

 Farms = GameObject.FindGameObjectsWithTag("Farm").OrderBy(x => Vector2.Distance(this.transform.position, x.transform.position))
                                                  .ThenBy(x => x.transform.parent.gameObject.GetComponent<FoodSpawn>().FoodList.Count)
                                                  .ToArray();

我拥有什么:
所以我的场景有一个矩形地板。 左边是立方体,右边是立方体,中间是AI(玩家) 每个立方体都装满了7块食物(主立方体的孩子)。 多维数据集的标记为Farm 列表FoodList是一个GameObject列表,在附加到每个多维数据集的脚本中,该列表包含多维数据集中的每个食物。

我想要达到的目标:
玩家需要决定哪个立方体充满他想去的食物 但他需要考虑到立方体和食物量的距离 因此,玩家需要以最接近的农场和农场的方式订购列表。食物最多的农场是名单的第一个元素。

现在列表确实按距离正确排序,因此最接近的立方体是第一个元素,但它会跳过.ThenBy行(或者我做错了)。

2 个答案:

答案 0 :(得分:0)

正如@Johan在评论中提到的,ThenBy仅在OrderBy子句中的两个对象之间存在联系时才有效。在您的情况下,您要考虑两个参数, 距离 食品数量 。你需要在这里做一些数学。根据每个参数的优先级,您可以使用以下内容:

OrderBy(x => (distanceForX * priorityOfDistance) + (foodCountForX * priorityOfFoodCount))

而不是

transform.parent.gameObject.GetComponent<FoodSpawn>();

你可以使用

GetComponentInParent<FoodSpawn>();

答案 1 :(得分:0)

所以我决定先把距离农场列表排序 我还给农场一个布尔,检查农场是否包含食物 然后玩家决定去最近的HasFood布尔为真的农场。

Farms = GameObject.FindGameObjectsWithTag("Farm").OrderBy(x => (Vector2.Distance(this.transform.position, x.transform.position)))
                                                 .ToArray();

ClosestFarm = Farms.First(x => x.GetComponentInParent<FoodSpawn>().HasFood == true);