C# 对于C中不同阶次的循环#

C# 对于C中不同阶次的循环#,c#,C#,我想检查两个特定数字之间的所有数字(不包括0),我想检查它们,不是从最小到最大,也不是从最接近零到最远 例如,如果我的定义数字是-4和3,那么我想按以下顺序来检查这些数字:-1,1,-2,2,-3,-4或1,-1,-2,-3,,-4(两者中的哪一个无关紧要)。在其他语言中,我可以使用foreach循环来实现这一点,如何在C#中实现它,如果答案是我怀疑的foreach循环,我如何为它构建列表 例如,在Tcl中,我会这样做: # num1 is the abs value of the negati

我想检查两个特定数字之间的所有数字(不包括0),我想检查它们,不是从最小到最大,也不是从最接近零到最远

例如,如果我的定义数字是
-4
3
,那么我想按以下顺序来检查这些数字:
-1
1
-2
2
-3
-4
1
-1
-2
-3,,
-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
}
#num1是负极限的abs值
集合l[列表]
对于{set i 1}{$i=$i}{
LAPPAND l[expr-1*$i]
}
如果{$num2>=$i}{
一美元
}
}
foreach num$l{
放入$num
}
列表值=新列表();
//将项目添加到列表中
//即价值。加上(-1);
排序(委托(intn1,intn2){return math.Abs(n1).CompareTo(math.Abs(n2));});
foreach(值中的var num)
{
//工作
}

您可以使用Linq通过返回函数对列表进行排序

foreach (int x in list.OrderBy(i=>Math.abs(i))
{
    // Do Stuff
}
比如:

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 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);
}
然而,你真正想要的更重要。我第一次常常不能正确地描述我的问题

int max=5;
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);
}
对于(inti=1,flip=1;i
这会让你很快康复的。 这几乎是一个正常的for循环,只有几个额外的计数器/条件

flip=flip^1:flip变量仅在1和0之间翻转。
i=i*-1:通过每个循环,我们改变符号以获得所需的交替数
i=i+(翻转==1?1:0):只有当计数器是正数时,我们才增加计数器。


--对不起,这根本不能回答问题。我略读了一下问题,得出了这个结论。

将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);
 }
var l=新列表();
对于(int i=1;i=i){
l、 添加(-1*i);
}
如果(num2>=i){
l、 加(i);
}
}
foreach(整数在l中){
系统控制台写入线(num);
}

整数列表是
list
<用于
的代码>是用于
。递增一个变量是
++
。添加到列表的是
Add
。而
foreach
foreach

显示您在其他语言中使用的代码,我们可以帮助您将其改编为C语言。您说您希望迭代由两个定义数字创建的序列,但您的Tcl示例显示了一个硬编码序列。无论哪种方式,我的答案都涉及“生成”序列以及跳过零,所以你可能想检查一下。现在代码不是硬编码的,我之前删除了这部分,因为我想知道在C#中使用什么数据类型,而不是查找数字的算法。这很好,但需要硬编码值。我认为他在寻找一种通用的方法。这不会改变他得到的价值观吗?不是-1,而是一旦abs完成,他会得到1吗?@JeremyK否。它根据选择器返回的值排序,但输出序列返回源对象,而不是选择器的结果。如果您使用返回值的数据类型的编译器,并且假定在
OrderBy
中使用的函数返回的类型与它接受的类型不同,则这一点非常明显。
 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);
 }