首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Linq按大小对列表进行排序

使用Linq按大小对列表进行排序
EN

Stack Overflow用户
提问于 2016-09-19 21:26:47
回答 2查看 110关注 0票数 0

我现在的代码:

代码语言:javascript
复制
 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

list FoodList是一个GameObject列表,在附加到每个立方体的脚本中,该列表包含立方体中的每一块食物。

我想要实现的目标:

玩家需要决定他想去哪个装满食物的立方体。

但他需要考虑到立方体的距离和食物的数量。

因此,玩家需要以这样的方式对列表进行排序,即最近的农场&拥有最多食物的农场是列表的第一个元素。

现在这个列表确实按照距离进行了正确的排序,所以最近的立方体是第一个元素,但它跳过了.ThenBy行(或者我做错了什么)。

EN

回答 2

Stack Overflow用户

发布于 2016-09-19 21:52:41

正如@Johan在评论中提到的,只有当OrderBy子句中的两个对象之间存在联系时,ThenBy才能工作。在您的例子中,由于您想要考虑这两个参数,distancenumber of food 。你需要在这里做一点数学运算。根据每个参数的优先级,您可以使用以下内容:

代码语言:javascript
复制
OrderBy(x => (distanceForX * priorityOfDistance) + (foodCountForX * priorityOfFoodCount))

而不是

代码语言:javascript
复制
transform.parent.gameObject.GetComponent<FoodSpawn>();

您可以使用

代码语言:javascript
复制
GetComponentInParent<FoodSpawn>();
票数 0
EN

Stack Overflow用户

发布于 2016-09-20 16:02:24

因此,我决定首先让它对距离上的农场列表进行排序。

我还给了farm一个bool,用来检查农场是否有食物。

然后玩家决定去最近的HasFood bool为true的农场。

代码语言:javascript
复制
Farms = GameObject.FindGameObjectsWithTag("Farm").OrderBy(x => (Vector2.Distance(this.transform.position, x.transform.position)))
                                                 .ToArray();

ClosestFarm = Farms.First(x => x.GetComponentInParent<FoodSpawn>().HasFood == true);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39574387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档