我在開發一個從給定整數(start)開始,然后在給定范圍( min到max)內從這個起點向上和向下計數的 for 回圈時遇到問題。我希望結果按到給定起點的距離排列。如果這里的 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
uj5u.com熱心網友回復:
你所追求的序列:
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 開始,向上和向下以 1 作為最小值,以 14 作為最大值。電話會是這樣的:
Sequence(7, 1).Interleave(Sequence(8, 14))
最后,這還允許您通過交換間隔輕松地從“上下”更改為“上下”。使用上面的示例:
Sequence(8, 14).Interleave(Sequence(7, 1))
請注意,它Sequence還有一個帶step引數的多載,因此您可以使用任意步長增量擴展下面的示例,而不僅僅是 1。
uj5u.com熱心網友回復:
一個簡單而優雅的解決方案可以生成您想要的數字序列,如下所示:
static IEnumerable<int>
UpDownCount(int start, int lower, int upper)
{
int i = start, j = start;
yield return start;
while (true)
{
bool ilimit = i <= upper,
jlimit = --j >= lower;
if (ilimit)
yield return i;
if (jlimit)
yield return j;
if (!(ilimit || jlimit))
yield break;
}
}
然后,您可以將該序列與 LINQ 或簡單foreach回圈一起使用:
foreach (int i in UpDownCount(4, 0, 10))
Console.WriteLine(i);
uj5u.com熱心網友回復:
這是一個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 " ");
}
}
}
}
uj5u.com熱心網友回復:
既然您明確宣告您需要一個產生模式的 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://www.uj5u.com/shujuku/495149.html
上一篇:使用for回圈在串列中向后迭代?
