【发布时间】: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.... 上收到错误消息
-
"我不想把它转换成一个列表" - 列表实际上是由数组支持的......