1

複数の配列を計算して解決しようとしている問題で立ち往生しています。

これがシナリオです...

ユーザーが自分のカード番号、つまり1234を入力すると、1、2、1、2のシーケンスで別の配列に格納されている各番号に複数の番号が必要になります。

したがって、1 * 1、2 * 2、3 * 1、4*2などに従って計算されます。

単一のforeachループ内で両方を計算するためにいくつかの異なる方法を試しましたが、重複を返すような運がないので、両方の配列を1つの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();
    }
}
4

8 に答える 8

2

どのような長さのカード番号でも、 を使用Aggregate()して各桁の値を計算し、それらを合計することができます。

int coefficient = 2;
chksum =  input.Aggregate(0, (sum, ch) => sum + (ch - '0') * (coefficient ^= 3));
于 2012-10-11T18:08:17.753 に答える
1

あなたの例では、

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

card_m.Length != card.Length最短のリストの最後まで「圧縮」するだけなので、これは有効ではありません。

MSDN Zip --指定された述語関数を使用して 2 つのシーケンスをマージします。

以下の拡張メソッドを追加し、このコードを実行して繰り返すことができます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];
    }
}
于 2012-10-11T17:45:39.283 に答える
1

card と card_m は常に同じ長さですか?

もしそうなら、次のようなことができます(最初に確認する必要があります)

for(int i =0;i<card.Length;i++)
{
   Console.WriteLine("Result: {0}", ((int)char.GetNumericValue(card[i]))*card_m[i]);
} 
于 2012-10-11T17:49:20.660 に答える
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();
    }
于 2012-10-11T17:50:11.493 に答える
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);
            }
于 2012-10-11T17:50:51.837 に答える
0
card.Select(char.GetNumericValue).Zip(card_m, (c, n) => c*n);
于 2012-10-11T17:46:07.730 に答える
0

foreach1 つのループで 2 つの配列を反復することはできません。その場合、単純な古いforループを使用する必要があります。Rosetta Codeに例があります。

于 2012-10-11T17:44:42.347 に答える
0

使用できます

for (int i = 0; i < card.Length; i++)
{
  var result = (int)char.GetNumericValue( card[i]) * (int)char.GetNumericValue(m_card[i]);
}
于 2012-10-11T17:47:52.057 に答える