Foreach计算多个数组

时间:2012-10-11 17:42:10

标签: c# arrays 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();
    }
}

8 个答案:

答案 0 :(得分:2)

对于任何长度的卡号,您只需使用Aggregate()计算每个数字的值,然后将它们相加。

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

答案 1 :(得分: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];
    }
}

答案 2 :(得分:1)

不确定你在做什么 你的卡和card_m总是一样长吗?

如果是这样你可以做一些事情(你必须先确定)

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

答案 3 :(得分:0)

您不能在单个foreach循环中迭代两个数组。在这种情况下,您必须使用普通的旧for循环。 Rosetta Code有一个例子。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以使用

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

答案 6 :(得分: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();
    }

答案 7 :(得分: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);
            }