2012-10-11 19 views
1

我被困在一個問題上,我試圖用計算多個數組來解決。Foreach來計算多個數組

這裏的情景......

,用戶將輸入自己的卡號,即1234,然後我需要多個存儲在1,2,1,2的順序另一個陣列的每個號碼。

因此,這將根據1 * 1,2 * 2,3 * 1,4 * 2,計算在等

我已經嘗試了幾種不同的計算二者的單一foreach循環內,但是我我沒有這樣的幸運,因爲我正在返回重複數據,所以我看到,如果有什麼方法可以將兩個數組合併成一個foreach循環?

我可以打印數據,所以現在我只是看到如何將它們放在一起。這裏是我迄今爲止...

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Enter your Card Number"); 
     char[] card = Console.ReadLine().ToCharArray(); 
     int[] card_m = { 1,2,1,2 }; 

     foreach (char c in card) 
     { 
      int number = (int)char.GetNumericValue(c); 
      Console.WriteLine("Converted Number: {0}", number); 
     } 

     foreach (int m in card_m) 
      Console.WriteLine("Card Number Multiplier: {0}", m); 

     Console.Read(); 
    } 
} 
+2

'card_m.Length == card.Length'? –

+2

如何使用'for'循環?這樣你可以使用for循環的計數器作爲訪問這兩個數組的索引。 – InSane

+0

所有卡號都由四位數組成嗎? –

回答

0

假設數組的長度可以不同,使用模運算循環的乘數陣列上:

static void Main(string[] args) { 
     Console.WriteLine("Enter your Card Number"); 

     char[] card = Console.ReadLine().ToCharArray(); 

     int[] card_m = { 1, 2 }; 

     for (int idx = 0; idx < card.Length; idx++) { 
      int number = (int) char.GetNumericValue(card[idx]); 
      Console.WriteLine("Converted Number: {0}", number); 

      // pull the multiplier from the card_m array 
      int m = card_m[idx % card_m.Length]; 

      Console.WriteLine("Card Number Multiplier: {0}", m); 
     } 

     Console.Read(); 
    } 
+0

確實。我只是想先把頭圍繞在這個特定的項目上。這正是我期待的「爲」。謝謝你的幫助。 – Curtis

+0

很高興爲您提供幫助......請務必在此過程中添加任何適當的錯誤檢查。例如,如果字符串不是數字,則GetNumericValue()將返回-1。 – jheddings

0

單一foreach循環無法遍歷兩個數組。在這種情況下,您必須使用普通的舊版for循環。 Rosetta Code有一個例子。

+0

當然可以,但它不方便。簡單的方法:只需定義自己的計數器並在循環結束時增加計數器。 – Servy

1

對於你的榜樣,

var multiplied = card.Select(char.GetNumericValue).Zip(card_m, (a,b) => a*b); 

這會不會是有效的,如果card_m.Length != card.Length,因爲它只會「拉鍊」,直到最短列表的末尾。

MSDN Zip - 通過使用指定的謂詞函數合併兩個序列。

您可以添加擴展方法下方運行這段代碼重複card_m

var multiplied = card.Select(char.GetNumericValue) 
        .Zip(card_m.Indefinite(), (a,b) => a*b); 

public static class Extensions 
{ 
    public static IEnumerable<int> Indefinite(this int[] source) 
    { 
     int i = 0; 

     while (true) 
      yield return source[i++ % source.Length]; 
    } 
} 
+0

什麼是zip? – nawfal

+1

'Zip'是一個函數,它接受兩個列表'[a,b,c]'和'[x,y,z]'並將它們組合成一個列表[[a,x),(b,y), (c,z)]'。 C#版本不是將它們分組爲元組,而是使用描述如何組合它們的函數。 –

0
card.Select(char.GetNumericValue).Zip(card_m, (c, n) => c*n); 
0

您可以使用

for (int i = 0; i < card.Length; i++) 
{ 
    var result = (int)char.GetNumericValue(card[i]) * (int)char.GetNumericValue(m_card[i]); 
} 
+1

缺少從char到int的轉換,但是很好。 – Servy

+0

是的,我添加了Servy謝謝,因爲我沒有完成 –

+0

現在你正在轉換從字符到整數;只有一個是char數組。另一個已經是一個int數組。如果你沒有完成,那麼你不應該發佈你的答案。 – Servy

1

不知道你正在做 做你的卡是什麼和card_m的長度一樣嗎?

如果是的話,你可以這樣做(你必須確保第一)

for(int i =0;i<card.Length;i++) 
{ 
    Console.WriteLine("Result: {0}", ((int)char.GetNumericValue(card[i]))*card_m[i]); 
} 
+0

如果需要,您可以循環到Math.Min(card.Length,card_m.Length)來處理它們不相同的情況。 – Servy

0

也許你可以試試這個,假設你的卡號可能有4位以上的數字

  Console.WriteLine("Enter your Card Number"); 
      char[] card = Console.ReadLine().ToCharArray(); 
      int[] card_m = { 1, 2, 1, 2 }; 
      int counter = 0; 
      foreach (char c in card) 
      { 
       int value = (int)char.GetNumericValue(c) * card_m[counter++%card_m.Length]; 
       Console.WriteLine("Converted Number: {0}", value); 
      } 
2

對於任何長度的卡號,您可以使用Aggregate()來計算每個數字的值,並將它們相加。

int coefficient = 2; 
chksum = input.Aggregate(0, (sum, ch) => sum + (ch - '0') * (coefficient ^= 3));