【发布时间】:2019-12-10 09:32:22
【问题描述】:
我正在制作一个具有Container 和X、Y 和Z 属性的应用程序。这些容器进入Ship。所有容器都正常,Cooled 或Valuable。有价值的要求是 X -1 和 X + 1 是空的。所以基本上贵重容器旁边的容器必须是空的。当它们为空时,我希望它在两者之间返回Container。
我用X、Y 和Z 预先制作了一个List<Container>。
public void ConstructShip()
{
for (int x = 1; x < widthX + 1; x++)
{
for (int y = 1; y < lengthY + 1; y++)
{
for (int z = 1; z < heightZ + 1; z++)
{
SortedContainers.Add(new Container(x, y, z, true, false, false, 0)); //xyz, (bool)empty, (bool)valuable, (bool)cooled, weight
}
}
}
}
问题:我试图让方法CheckValuableAndReturnPlace() 返回一个空容器,其中另一个Container 的X - 1 和X + 1 的坐标是Empty 而不是Valuable。
private Container CheckValuableAndReturnPlace()
{
Container freeContainer = SortedContainers
.First(c => c.X > 0 && c.X <= WidthX && c.Empty && c.Z <= HeightZ &&
SortedContainers.First(c2 => c2.X == c.X - 1).Empty &&
SortedContainers.First(c2 => c2.X == c.X + 1).Empty &&
!SortedContainers.First(c2 => c2.X == c.X - 1).Valuable &&
!SortedContainers.First(c2 => c2.X == c.X + 1).Valuable)
.FirstOrDefault();
if (freeContainer != null)
{
return freeContainer;
}
return new Container();
}
为了澄清:我想要一个EmptyContainer(列表中的所有这些都已经是),其中边,所以 X -1 和 X +1 也是Empty。或者,如果位置是 X = 1,则只有 X = 2 需要为空且无价值或 X = MaxXLength 而不是只有 X = MaxXlength - 1 需要为空且无价值
单元测试:
[TestInitialize()]
public void Initialize()
{
Ship ship = new Ship(4, 3, 3); //lengthX, widthY, heightZ
for (int x = 1; x < 5; x++)
{
for (int y = 1; y < 4; y++)
{
for (int z = 1; z < 4; z++)
{
ship.SortedContainers.Add(new Container(x, y, z, true, false, false, 0));
}
}
}
}
[TestMethod()]
public void CheckValuableAndReturnPlaceTest_Working()
{
Container freeContainer = ship.CheckValuableAndReturnPlace();
Container expectedContainer = new Container(1, 1, 1, true, false, false, 0);
Assert.AreEqual(JsonConvert.SerializeObject(expectedContainer), JsonConvert.SerializeObject(freeContainer));
}
最后编辑:
抱歉,我的问题含糊不清,我尽力不提供不必要的过多信息,但我想通了。感谢一位试图给我答案的人:p。
【问题讨论】:
-
SortedContainerStacks.Where((c, i) => c.X > 0 && c.X < SortedContainerStacks.Count - 1 && SortedContainerStacks[c.X - 1].Empty && SortedContainerStacks[c.X + 1].Empty).FirstOrDefault()? -
@Zheng-rongCai stackoverflow.com/q/59258472/11683
-
GSerg 的建议实际上似乎相当不错,并且看起来它可以处理边缘情况,但它总是会说第一个和最后一个容器不有价值。如果您希望它们唯一的邻居是否为空,您可能希望在您的规范中澄清它们是否有价值。此外,您可以使用
Any,而不是使用FirstOrDefault然后检查它是否是null -
我不清楚这个问题 - 你指的是标题中的错误,然后你谈论“返回”一个容器但提出了一个 void 方法,然后描述一个失败的测试但不显示测试。我认为花更多的精力来澄清这个问题比增加赏金更有帮助。
-
恐怕还有太多我们不知道的地方。什么是过滤容器?所有这些容器构造函数参数是什么?哪个 LINQ 调用失败?目前我们有部分代码转储,但没有太多迹象表明您为诊断问题所做的工作。