我有一个数字列表,{1,2,3,4,...,End},其中指定了End。我想在列表中的给定数字Find
周围显示最接近的X数字。如果x是奇数,我希望额外的数字大于一边。
End: 6
X: 2
Find: 3
结果应为:{2,3,4}
End: 6
X: 4
Find: 5
结果应为:{2,3,4,5,6}
End: 6
X: 3
Find: 3
结果应为:{2,3,4,5}
我认为简单地找到一个开始和停止值会更容易,而不是实际生成列表,但我真的不在乎这种或那种方式。
如果重要的话,我正在使用C#4.0。
编辑:我可以想办法做到这一点,但如果是这样的话,它涉及的方式太多了。
if (Find == 1)
{
Start = Find;
Stop = (Find + X < End ? Find + X : End);
}
else if (Find == 2)
{
if (X == 1)
{
Start = Find;
End = (Find + 1 < End ? Find + 1 : End);
}
...
}
你可以希望看到它的发展方向。我假设我将不得不使用(X%2 == 0)进行奇数/偶数检查。然后有些人将less = Find - X/2
和more = Find + X/2
绑定在一起。如果不是这样的话,我就无法找到最小的路径。
编辑II:我还应该澄清,我实际上并没有创建{1,2,3,4 ... End}的列表,但是我可能需要从Find-X / 2开始。
答案 0 :(得分:3)
我意识到你正在学习,出于对此的尊重,我不会为你提供完整的解决方案。但是,我会尽力向你推动正确的方向。
通过查看您尝试过的解决方案,我认为您需要先找出所需的算法,然后再尝试编写可能会或可能不会解决问题的内容。正如你自己所说,为输入中的每个可能的排列编写一个if语句并不是一个可管理的解决方案。您需要找到一个足够通用的算法,您可以将其用于您获得的任何输入,并且仍能获得正确的结果。
基本上,在您能够编写有效的解决方案之前,您需要回答两个问题。
考虑到示例基本情况,您知道给定参数X
包含一个数字,告诉您应显示Find
周围的数字。因此,您需要在X
的两边平均分配Find
。
因此:
3 - 4/2
或 Find - X/2
。 3 + 4/2
或 Find + X/2
。 首先编写一个运行并适用于基本案例的程序。 完成后,坐下来弄清楚如何找到更复杂案例的上限和下限。
祝你好运!答案 1 :(得分:2)
您可以查看扩展方法。跳过并采取。
x.Skip(3).Take(4);
这将有助于你在尝试做什么