部分代码审查以及答案。
但它不起作用......为什么?
该代码不起作用,因为您要重新分配 sequenceY 到一个全新的值。
我的另一个问题是程序员如何处理长度未知的序列?
因此,知道了这一点,我们可以在这里做一些事情:创建一个数组并使用 Array.Resize,使用 List<T>,填充初始数组,然后将其交换为已填充的正确大小之一。
我将假设“蒸汽”数字是偶数。
你的命名不好:nizx和nizy没有传达意思或与问题对齐。
我将演示最后一个选项(因为您说您还不知道如何在此类中使用 .NET 的许多适度复杂部分,这很好) : 填充初始数组并将其换成新数组。这将在O(n^2) 时间运行(排序)。
那么,让我们从源数组开始吧。
int[] sequenceX = new int[20];
接下来,我们将目标数组定义为与源数组相同的大小。 (这是其中可以存储的最大值数,我们稍后会缩小它。)
int[] sequenceY = new int[sequenceX.Length];
然后我们需要一个变量来保存我们找到的符合我们标准的数字:
int steamNumbers = 0;
最后,我们的Random。
Random random = new Random();
然后,我们会像您一样查看我们所有的sequenceX,但我们会稍微更新一下逻辑。
for (int i = 0; i < sequenceX.Length; i++)
{
sequenceX[i] = random.Next(1, 30);
if (sequenceX[i] % 2 == 0)
{
sequenceY[steamNumbers] = sequenceX[i];
steamNumbers++;
}
}
所以我们的代码看起来几乎和你的一样,但是我们还有一件事要做:因为你只希望sequenceY包含steamNumbers,我们有缩小它什么的。
int[] tempSequenceY = sequenceY;
sequenceY = new int[steamNumbers];
for (int i = 0; i < steamNumbers; i++)
{
sequenceY[i] = tempSequenceY[i];
}
现在sequenceY 里面只有你的 Steam 号码。
最终代码:
int[] sequenceX = new int[20];
int[] sequenceY = new int[sequenceX.Length];
int steamNumbers = 0;
Random random = new Random();
for (int i = 0; i < sequenceX.Length; i++)
{
sequenceX[i] = random.Next(1, 30);
if (sequenceX[i] % 2 == 0)
{
sequenceY[steamNumbers] = sequenceX[i];
steamNumbers++;
}
}
int[] tempSequenceY = sequenceY;
sequenceY = new int[steamNumbers];
for (int i = 0; i < steamNumbers; i++)
{
sequenceY[i] = tempSequenceY[i];
}
// Print your `sequenceY` here.
你也可以很容易地将它提取到一个方法中:
public int[] GetSteamNumbers(int sequenceCount, int randomMinimum, int randomMaximum)
{
int[] sequenceX = new int[sequenceCount];
int[] sequenceY = new int[sequenceX.Length];
int steamNumbers = 0;
Random random = new Random();
for (int i = 0; i < sequenceX.Length; i++)
{
sequenceX[i] = random.Next(randomMinimum, randomMaximum);
if (sequenceX[i] % 2 == 0)
{
sequenceY[steamNumbers] = sequenceX[i];
steamNumbers++;
}
}
int[] tempSequenceY = sequenceY;
sequenceY = new int[steamNumbers];
for (int i = 0; i < steamNumbers; i++)
{
sequenceY[i] = tempSequenceY[i];
}
return sequenceY;
}
然后调用它:
int[] steamNumbers = GetSteamNumbers(20, 1, 30);
当然,对于更高级的用户(这对你没有帮助,但它可能对其他人有帮助)我们可以使用 LINQ 执行以下操作:
var random = new Random();
var sequenceY = Enumerable.Range(1, 20)
.Select(x => random.Next(1, 30))
.Where(x => x % 2 == 0)
.ToArray();
应该有同样的效果。 (只是证明 C# 中还有一些值得期待的东西。)
免责声明:我在 IDE 之外编写了整个答案并且没有实际编译它,我不保证代码的准确性,但过程本身应该相当简单。