1

我遇到了一个我试图通过计算多个数组来解决的问题。

这是场景...

用户将输入他们的卡号,即 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();
    }
}
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 --使用指定的谓词函数合并两个序列。

您可以在下面添加扩展方法并运行此代码以重复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

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

于 2012-10-11T17:44:42.347 回答
0
card.Select(char.GetNumericValue).Zip(card_m, (c, n) => c*n);
于 2012-10-11T17:46:07.730 回答
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 回答
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 回答