数组排序的方法 Unity C#
Posted
技术标签:
【中文标题】数组排序的方法 Unity C#【英文标题】:Ways of Sorting an Array Unity C# 【发布时间】:2021-04-03 05:46:12 【问题描述】:嗨,基本上我在 Struct 中有一个库存:库存插槽 [] 插槽。我想做的是对数组进行排序 取决于库存的类型。我不想将其转换为 List,因为实际上我的所有代码都是基于数组的,并且所有内容都已附加并且运行良好。我尝试了很多方法来查看它查看了所有整理库存的 youtube 视频。
我创造的最佳方式之一:
我尝试创建一个辅助数组:
private void Awake()
slots = new InventorySlot[inventorySize];
slotList = new InventorySlot[inventorySize];
public void SortByTypeNameAscending()
var SortedSlots = slotList.Where(t => t.item != null).OrderBy(t => t.item.GetAllowedEquipLocation()).ToArray();
slots = SortedSlots;
inventoryUpdated?.Invoke();
当我将一个项目添加到库存或删除它时,我会更新两个数组:slotList = slot 在添加或删除函数中。 SlotList 包含所有项目,并且 Slots 将根据“过滤器”进行更改。如果我删除 Where(t => t.item != null),那么问题是如果我有空的插槽,那么它会给我一个空错误。尝试做类似 InventorySlot?[] slots 和 slots = new InventorySlot?[inventorySize] 的事情来接受空值,但我的排序函数有多个错误。另一方面,当我使用 Where(t => t.item != null) 如果我有 10 个插槽并且 1/10 为空时,排序工作但库存变为 9 个插槽而不是 10 个插槽的库存(有 1免费插槽),我将无法添加其他 1 个项目。
我不知道是否有办法解决它,也许是一种在它自己的函数中将其转换为 List 并将其重新转换为数组的方法?有什么想法吗?
【问题讨论】:
您可以使用列表进行排序,然后将缺少的部分添加到列表中,最后将列表转换回数组。 (当然,如果这些数组的大小不大,这是可行的)var SortedSlots = slotList.OrderBy(t => t?.item?.GetAllowedEquipLocation()).ThenBy(z => z == null).ToArray();
这是你想要的吗?
@Steve 我不能用那个,库存会越来越多。最终会导致问题。
@mjwills 如果我这样做,我会在 t? 上收到错误消息。如果我删除 ?,我会在 z ==null.... 上收到错误消息
"我不想把它转换成一个列表" - 列表实际上是由数组支持的......
【参考方案1】:
对于库存,我真的建议List<InventorySlot>
。然后,您可以删除并插入到列表中,而不必担心创建新数组或移动项目。
如果您要将库存映射到某种网格,那么我建议您将 x 和 y 属性添加到 InventorySlot
类,以便您可以跟踪它在库存网格中的位置。无需对列表进行排序以匹配库存的显示。
这也可以让您无需存储两个InventorySlot
项目列表,您只需使用一个列表即可。当你去渲染你的库存网格时,只需迭代列表并将项目的精灵绘制/移动到正确的位置。
我知道您有设置代码来处理任何地方的数组,但是您的游戏的其他部分知道您的库存是一个数组这一事实是一个架构问题。您应该将您的库存抽象为某种界面,任何想要使用库存的人都必须通过该界面。不应暴露库存如何存储在内存中的内部结构。
【讨论】:
“但是你的游戏的其他部分知道你的库存是一个数组,这是一个架构问题。” +1 @jjxtra 感谢您的回答。由于我的 InventorySlot 是一个包含项目和编号的结构,因此我通常会使用数组进行 slot[i].item = X。使用 List 时,slot[i].item 的等价物是什么?或者至少我如何使用 List 获取结构的元素? list.FirsOrDefault(l=>l.Index == x)以上是关于数组排序的方法 Unity C#的主要内容,如果未能解决你的问题,请参考以下文章