我遇到了一个问题,我正在尝试计算多个数组。
这是场景......
用户将输入他们的卡号,即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();
}
}
答案 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);
}