我正在为学校做一个项目,我正在努力决定我应该如何去做。
这是一个餐厅模拟。我生成了一张随机的 table 和等候方列表。我随机安排了一些有保留的聚会,有些没有在等候名单上。我希望有保留的一方优先。
对列表进行排序,以便所有有保留的各方都在一端,而没有另一端的各方是否是解决此问题的好方法?
然后我可以评估列表,看看这个聚会是否适合餐 table ,然后让他们就座或继续下一个聚会。还是有更聪明的方法来解决这个问题?任何意见表示赞赏!
最佳答案
var groupedParties = parties.GroupBy(p => p.HasReservation);
这是目前为止我看到的最干净的方式。您会得到一个包含两组的列表,一组包含没有预订的各方,另一组包含有预订的各方。您现在可以单独处理不同类型的等待方的座位。
编辑
static void Main(string[] args)
{
GenerateRandomDataSomehow();
var groupedParties = _parties.GroupBy(p => p.HasReservation)
SeatParty(groupedParties.FirstOrDefault(g => g.Key == true));
SeatParty(groupedParties.FirstOrDefault(g => g.Key == false));
}
private static void SeatParty(IEnumerable<Party> partyGroup)
{
if (partyGroup == null) return;
foreach (var party in partyGroup.OrderBy(p => p.ArrivalTime))
{
var properTable = _tables.FirstOrDefault(t => t.SeatsCount == party.PersonsCount &&
t.Party == null);
if (properTable == null) continue;
properTable.Party = party;
}
}
这是一个带有更多 LINQ 的非常简单的实现。选择标准需要适当扩展。在此表中,如果没有其他人坐在这张 table 上,并且如果人数与相应 table 的座位数完全一致,则该表被评估为“适当”。如果找不到合适的表,则跳过该组。
关于c# - 排序列表是最好的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15155421/