【发布时间】:2016-01-08 16:18:14
【问题描述】:
我正在尝试输出数组的奇数和偶数,我已经完成了所有工作,但是由于某种原因,当我创建一个 foreach 循环并输出每个奇数/偶数数字时,它以零开头?
设置方式是,用户在每个字母之间输入 10 个带逗号的数字(以字符串开头),然后删除逗号并将数字转换为 int 并将其放入 int 数组中,然后在其他类中使用。我输入1,2,3,4,5,6,7,8,9,1来测试一下。
Odds(ai.Odds);
Evens(ai.Evens);
Console.ReadKey();
}
public static void Odds(int[] odds)
{
Console.WriteLine("\nOdds:");
foreach (var odd in odds)
{
Console.Write(odd + " ");
}
}
public static void Evens(int[] evens)
{
Console.WriteLine("\nEvens:");
foreach (var even in evens)
{
Console.Write(even + " ");
}
}
并在单独的班级中发挥作用:
public int[] Odds
{
get
{
int count = 0;
int[] odds = new int[NumArray.Length];
string[] oddNums = {"1", "3", "5", "7", "9"};
foreach (int num in NumArray)
{
foreach (string oddNum in oddNums)
{
if (num.ToString().EndsWith(oddNum))
{
odds[count++] = num;
}
}
}
Array.Sort(odds);
return RemoveDuplicates(odds);
}
}
public int[] Evens
{
get
{
int count = 0;
int[] evens = new int[NumArray.Length];
string[] evenNum = {"0", "2", "4", "6", "8"};
foreach (int num in NumArray)
{
foreach (string oddNum in evenNum)
{
if (num.ToString().EndsWith(oddNum))
{
evens[count++] = num;
}
}
}
Array.Sort(evens);
return RemoveDuplicates(evens);
}
}
这里是 RemoveDuplicates 方法:
private int[] RemoveDuplicates(int[] numbers)
{
if (numbers.Length == 0)
{
return numbers;
}
int[] uniques = new int[numbers.Length];
int previousVal = numbers[0];
uniques[0] = numbers[0];
int count = 1;
for (int i = 1; i < numbers.Length; i++)
{
if (numbers[i] == previousVal) continue;
previousVal = numbers[i];
uniques[count++] = numbers[i];
}
Array.Resize(ref uniques, count);
return uniques;
}
作为输出我得到(vvv),但我不希望它们的开头都有 0,我根本不想要 0
【问题讨论】:
-
如果您发布一个简短但完整的示例程序,并对其进行适当的格式化,而不是在方法中途以代码开头的点点滴滴,这将更容易为您提供帮助。
-
我输入 1,2,3,4,5,6,7,8,9,1 来测试它。,包含输出的内容会很有用来自该输入以及您的预期。
-
另外,这是一种非常可怕的方法来确定某事是奇数还是偶数。与其依赖字符串中的最后一个数字,更简单的处理方法是将字符串转换为数字,然后执行
num%2,如果是偶数则为0,如果为奇数则为1。跨度> -
@MattBurland:如果是奇数和负数,则为-1...我通常使用
num & 1。 -
@JonSkeet:公平点,但我通常只测试
num%2 == 0,所以如果奇数是1或-1不是问题(如果不是偶数,那就是奇数) .但我确实喜欢& 1的想法,从现在开始我可能不得不使用它。