我很难开发一个从给定整数开始的for循环(start),然后在给定的范围内(从最小到最大)从这个起点开始计算和。我想要的结果是有序的距离到给定的开始。如果一个for -循环不是这里的正确工具,我是开放的其他建议!
由于这一点很难解释,下面有一个例子:
var start = 4;
var max = 10;
var min = 0;
var stepSize = 1;
for(var i=startIndex; i>=min && i<=max; ???) {
Console.WriteLine(i)
}结果应该如下所示:
4 5 3 6 2 7 1 8 0 9 10对我来说,真正棘手的部分是,为了达到最大值10,同时不低于0,必须停止交替。
我开始实验,并有了一个解决方案,可以适用于第一步:
const int start = 4;
const int stepSize = 1;
for (var (i,j,k) = (start,1,5); Math.Abs(j)<=11; k=(k+j),j=-j-Math.Sign(j)*stepSize,i=(k+(start-5))%11) {
Console.WriteLine(i);
}对于需要交互的第一部分来说,这很好,但是一旦需要停止替换,它就会中断。这个实验的结果是:
4 5 3 6 2 7 1 8 0 9 -1发布于 2022-06-23 20:14:09
这里有一个for循环,但就像其他人已经提到的那样,我认为其他结构更适合您的任务:
public static void Main() {
int start = 4;
int max = 10;
int min = 0;
int stepSize = 1;
for(int i=start, j=start; i>=min || j<=max; i-=stepSize, j+=stepSize) {
if (i==start) {
Console.Write(i + " ");
}
else {
if (j <= max) {
Console.Write(j + " ");
}
if (i >= min) {
Console.Write(i + " ");
}
}
}
}发布于 2022-06-23 20:33:59
你想要的顺序:
4 5 3 6 2 7 1 8 0 9 10可指定如下:
4 - 3 - 2 - 1 - 0
- 5 - 6 - 7 - 8 - 9 10
- - - - - - - - - - --
4 5 3 6 2 7 1 8 0 9 10使用类似于MoreLinq的东西,可以这样表示:
Sequence(4, 0).Interleave(Sequence(5, 10))显然,您通过控制两个序列的值来控制start、max和min。因此,假设您想从7开始,向上和向下,作为最小值,14作为最大值。这个电话就像:
Sequence(7, 1).Interleave(Sequence(8, 14))最后,这还允许您通过交换间隔,轻松地从“向上-向下”更改为“向下”。使用上面的例子:
Sequence(8, 14).Interleave(Sequence(7, 1))请注意,Sequence还有一个重载,它接受一个step参数,因此您还可以使用任意的步骤增量(而不仅仅是1 )来扩展下面的示例。
发布于 2022-06-23 20:49:02
由于您明确声明要生成模式的for循环,那么这种方法如何:
首先找到更大的“距离”,然后让循环运行到这个点,而不是从0开始。在循环中,检查两个方向,并内联地进行计算,并使用原始值一次调用该方法。
int x = 4;
int min = 0;
int max = 10;
int largest = Math.Max(Math.Abs(min - x), Math.Abs(max - x));
YourMethod(x);
for (int i = 1; i <= largest; i++)
{
if (x + i <= max)
YourMethod(x + i);
if (x - i >= min)
YourMethod(x - i);
}https://stackoverflow.com/questions/72735081
复制相似问题