2013-03-21 46 views
2

我想檢查2個具體數字(不包括0)之間的所有數字,我想從最小到最大或反之,從最接近的零到最遠。for循環與C#中的不同順序#

如果我定義數字,例如,是-43然後我想去過的號碼休耕順序:-11-22-33-41-12-2-3,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 
} 
+2

顯示您在其他語言中使用的代碼,我們可以幫助您將其應用於C#。 – 2013-03-21 17:59:53

+0

'0'怎麼樣? – 2013-03-21 18:06:47

+0

你說你想迭代由兩個定義數字創建的序列,但是你的Tcl例子顯示了一個硬編碼序列。無論哪種方式,我的答案都處理「產生」序列以及跳過零,所以你可能想給它一張支票。 – 2013-03-21 18:09:59

回答

7

您可以使用LINQ通過一個函數的返回命令的列表。

foreach (int x in list.OrderBy(i=>Math.abs(i)) 
{ 
    // Do Stuff 
} 
+0

這不會改變他的價值嗎?不是-1,一旦腹肌完成,他會得到1嗎? – JeremyK 2013-03-21 18:06:07

+2

@JeremyK編號它對選擇器返回的值進行排序,但輸出序列返回源對象,而不是選擇器的結果。如果你有一個來自返回值的數據類型的編譯器,這很明顯,假設'OrderBy'中使用的函數沒有返回它接受的相同類型。 – Servy 2013-03-21 18:07:29

1
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 
} 
+1

這很好,但需要硬編碼值。我認爲他正在尋找一種通用的方法。 – Inisheer 2013-03-21 18:02:17

+0

Doh,沒有真正閱讀他最接近零評論。我的不好 – JeremyK 2013-03-21 18:05:09

0

喜歡的東西:

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 
} 

只是不要忘記將endumstartnum更大,你是好去。

1

您選擇的回答與您在問題中陳述的內容不符。

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); 
} 

但是,你真正想要的是什麼更重要。我經常不會在第一時間正確描述我的問題。

0
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); 
} 

這應該解決你的問題。 這只是一個正常的循環只有一些額外的計數器/條件。

倒裝=倒裝^ 1:翻轉變量只是翻轉1和0之間
I = I * -1:每個循環通過我們改變符號以獲得所需的交變數
I = I +(翻轉== 1?1:0):如果它是一個正數,我們只增加計數器。

- 對不起,這甚至沒有回答這個問題。我瀏覽了這個問題,並提出了這個問題。

1

您的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>forfor。遞增一個變量是++。追加到列表中的是Add。而foreachforeach