如何在数组中同时存储int值与自定义对象实现仓库布局建模
解决方案
核心思路是统一二维数组的元素类型,同时兼容通行状态标记和货架对象存储能力,推荐使用以下类型安全的实现方案:
1 自定义统一仓库单元格类型
首先定义单元格类型枚举和单元格类,数组的每一个元素都是该单元格类的实例,既可以标记当前位置的通行属性,也可以存储货架对应的自定义对象。
步骤1:定义枚举和单元格类
// 单元格类型枚举 public enum CelType { 不可通行, 可通行, 货架 } // 统一仓库单元格类 public class MagazijnCel { public CelType Type { get; set; } public MagazijnObject Item { get; set; } } // 你原来的货架对象类保持不变 public class MagazijnObject { public string Locatie; public int Ranking; public string Item; public MagazijnObject(string loc, int rank, string it) { Locatie = loc; Ranking = rank; Item = it; } }
步骤2:修改数组声明和赋值逻辑
static void Main(string[] args) { MagazijnObject voorbeeld = new MagazijnObject("D02020A", 1, "Meel"); Console.WriteLine(voorbeeld.Locatie); Console.WriteLine(voorbeeld.Ranking); Console.WriteLine(voorbeeld.Item); // 数组类型改为自定义的单元格类数组 MagazijnCel[,] GangVoorbeeld = new MagazijnCel[5, 10]; string gang = "D02"; // 遍历数组初始化 for (int i = 0; i < GangVoorbeeld.GetLength(0); i++) { for (int j = 0; j < GangVoorbeeld.GetLength(1); j++) { GangVoorbeeld[i, j] = new MagazijnCel(); if (i == 1 || i == 3) // 货架位置 { GangVoorbeeld[i, j].Type = CelType.货架; GangVoorbeeld[i, j].Item = new MagazijnObject(gang + i + j, 1, "test"); } else if (i == 2) // 中间通道,可通行 { GangVoorbeeld[i, j].Type = CelType.可通行; GangVoorbeeld[i, j].Item = null; } else // 其他位置不可通行 { GangVoorbeeld[i, j].Type = CelType.不可通行; GangVoorbeeld[i, j].Item = null; } } } // 后续使用示例:判断某个位置是否可通行 bool canWalk = GangVoorbeeld[2, 3].Type == CelType.可通行; // 读取货架信息 if (GangVoorbeeld[1, 2].Type == CelType.货架) { var goods = GangVoorbeeld[1, 2].Item; Console.WriteLine(goods.Locatie); } }
可选简化方案(不推荐)
如果不想额外定义类,可直接声明object[,]类型的二维数组,可通行位置存整数1,不可通行存整数0,货架位置存MagazijnObject实例。但该方案每次读取数据都需要做类型判断和转换,类型不安全,容易出现运行时错误。
内容的提问来源于stack exchange,提问作者user15916724
相关产品推荐
相关产品推荐

