在 C# 中具有不同顺序的 for 循环

本文关键字:顺序 for 循环 | 更新日期: 2023-09-27 18:05:15

我想遍历 2 个特定数字(不包括 0(之间的所有数字,并且我想从最接近零到最远而不是从最小到最大或相反来检查它们。

例如,如果我的定义数字是-43,那么我想按休耕顺序检查数字:-11-22-33-41-12-2-33-4(两者中的哪一个无关紧要(。在其他语言中,我可以使用foreach循环来做到这一点,如何在 C# 中实现它,如果答案是我怀疑是foreach循环,我该如何为它构建列表?

例如,在 Tcl 中,我会这样做:

# num1 is the abs value of the negative limit
set l [list ]
for {set i 1} {$i <= [max $num1 $num2]} {incr i} {
    if {$num1 >= $i} {
        lappend l [expr -1 * $i]
    }
    if {$num2 >= $i} {
        lappend l $i
    }
}
foreach num $l {
    puts $num
}

在 C# 中具有不同顺序的 for 循环

可以使用 Linq 按函数的返回对列表进行排序。

foreach (int x in list.OrderBy(i=>Math.abs(i))
{
    // Do Stuff
}
List<int> values = new List<int>();
// Add items to list
// i.e. values.Add(-1);
values.Sort(delegate(int n1, int n2) { return math.Abs(n1).CompareTo(math.Abs(n2)); });
foreach(var num in values)
{
// Do work
}

你选择的答案与你在问题中所说的不符。

int a=-4, b=3;
var list=Enumerable.Range(1, Math.Max(Math.Abs(a), Math.Abs(b))).SelectMany(x => new[] { x, -x });
foreach(var num in list) {
    Console.Write(" {0}", num);
}

但是,真正想要的匹配更重要。我经常在第一次没有正确描述我的问题。

将 Tcl 函数转换为 C# 非常简单:

 var l = new List<int>();
 for (int i = 1; i <= Math.Max(num1, num2); i++) {
  if (num1 >= i) {
   l.Add(-1 * i);
  }
  if (num2 >= i) {
   l.Add(i);
  }
 }
 foreach (int num in l) {
  System.Console.WriteLine(num);
 }

整数列表List<int>for for.递增变量是++ 。追加到列表是Addforeach foreach.

像这样:

int startnum = -4;
int endnum = 3;
foreach (int x in Enumerable.Range(startnum, (endnum - startnum) + 1).OrderBy(n => Math.Abs(n))) {
if (x == 0)
   continue;
// Do stuff
}

只是不要忘记让endum大于startnum,你就可以走了。

int max = 5;
for (int i = 1, flip = 1; i < max; flip = flip ^ 1, i =  i * -1 , i = i + (flip == 1 ? 1 : 0) )
{
    System.Diagnostics.Debug.WriteLine(i);
}

这应该可以解决你的问题。它几乎是一个正常的 for 循环,只有几个额外的计数器/条件。

flip = flip ^ 1 : flip 变量只是在 1 和 0 之间翻转。
i = i * -1 : 每次循环我们都会更改符号以获得所需的交替数
i = i + (flip == 1 ? 1 : 0( : 我们只在计数器是正数时递增计数器。

-对不起,这甚至没有回答这个问题。我略过了这个问题,想出了这个。