在交互嵌套数据集上构造查询的最佳方法

时间:2014-10-29 14:02:52

标签: c# performance linq

我正在制作一个关于运行工厂的游戏(使用C#/ OpenTK)。用户设计房间,雇用工人和订单库存。其余的大多是自动化的。

我挣扎的是工人任务/工作系统的设计。

工厂的基本结构是:
-Factory持有客房清单
-Room拥有家具清单
-Furniture持有工作列表,ItemSlots列表和JobAreas列表 -ItemSlot持有项目
-Job,ItemSlot,Item和JobArea为"可用"

乔布斯的结构是:
-Job持有物品清单(完成工作需要收集的物品)
-Job持有ItemSlots列表(需要放置物品)
-Job持有JobAreas列表(工人在完成工作时使用的椅子等区域)

要使作业可以选择,需要以下内容 - 不是别人做的(job.Available == true)
- 对于每个需要的物品,该类型的物品存在且可用 - 对于所需的每个ItemSlot,该类型的ItemSlot存在且可用 - 对于每个需要的JobArea,该类型的JobArea存在且可用

想法是空闲工作人员会向工厂询问当前可用作业的列表,然后选择要执行的作业(如果没有作业,则默认为空闲)。

我需要帮助的是构建查询以获取可用作业列表的方法(如果在此过程中选择了该作业,我需要收集将使用哪些项目/工作区域的信息)。

那种蛮力"方法我现在想的是这样的事情:

public List<JobDetails> GetAvailableJobs()
{
    var availableJobs = new List<JobDetails>();
    foreach(Room r in factory.Rooms)
    foreach(Job j in r.Jobs)
     {
      JobDetails details = IsJobAvailable(j);
      if (details!=null) availableJobs.Add(details);
     }
     return details;
}
public JobDetails IsJobAvailable(Job j)
{
    JobDetails details = new JobDetails();
    //get available items
    foreach (Item i in j.Items)
    foreach (Room r in factory.Rooms)
    foreach (Furniture f in r.Furnitures)
    foreach (ItemSlot s in f.ItemSlots)
    if (s.Item.Type == i.Type && i.Available) details.Items.Add(i);
    //get available slots
    foreach (ItemSlot itSl in j.ItemSlots)
    foreach (Room r in factory.Rooms)
    foreach (Furniture f in r.Furnitures)
    foreach (Itemslot s in f.ItemSlots)
    if (s.Type == itSl.Type && s.Available) details.ItemSlots.Add(s);
    //get available JobAreas
    foreach (JobArea jobA in j.JobAreas)
    foreach (ItemSlot itSl in j.ItemSlots)
    foreach (Room r in factory.Rooms)
    foreach (Furniture f in r.Furnitures)
    foreach (JobArea jA in f.JobAreas)
    if (jA.Type == jobA.Type && jA.Avaialble) details.JobAreas.Add(jA);

    //check if job conditions are met
    if (details.Items.Count >= j.Items.Count && details.ItemSlots.Count >= j.ItemSlots.Count && details.JobAreas.Count >= j.JobAreas.Count) return details; else return null;
}

问题是,这是一个巨大的重复和长时间的查询。这并没有利用我所知道的关于数据的关系,例如特定的JobAreas只能在特定的房间中找到,或者某些项目只能在某些类型的家具中找到;目前我只是查看每个房间里的每一个物体来搜索每件物品。

我能做得更好吗? LINQ是简化查询的选项吗?有没有办法在工作中嵌入信息,提供线索在哪里查看(仅检查&#34; Oil Cannisters&#34;在类型&#34;机器&#34;和继承自&的房间? #34; MachineRooms&#34)

要清楚,这是一个关于设计而不是实施的问题。我想要一些关于如何构造Jobs的指针以及有效查询Items,ItemSlots和JobAreas是否可用于给定作业的最佳方法,并将那些可用的东西的实例传回(因此它们可以被标记为Available =是假的,工人可以和他们一起做事。)

Haighstrom

0 个答案:

没有答案