在课堂上,我们目前正在制作彩票作为一个项目,我目前陷入了一个 equals 问题: 同一行不允许在同一张票上多次出现。
我尝试了一些方法,但还没有任何效果。
public class TalRækker //rows
{
static Random rnd = new Random();
public static int[,] Line()
{
int[,] line = new int[10, 7];
//int x = rnd.Next(1, 36);
for (int i = 0; i < line.GetLength(0); i++)
{
for (int j = 0; j < line.GetLength(1); j++)
{
line[i, j] = rnd.Next(1, 36);
}
}
return line;
}
public static void Print2DArray<T>(T[,] line)
{
var lineNumber = 1;
for (int i = 0; i < line.GetLength(0); i++)
{
Console.Write(" {0:D2}.\t", lineNumber);
for(int j = 0; j < line.GetLength(1); j++)
{
Console.Write("{0:D2} ", line[i, j]);
}
Console.WriteLine();
lineNumber++;
}
}
我已将代码更新为以下内容,但仍然遇到问题:
namespace lottery
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("\t Lotto " + DateTime.Now.ToString("dd/MM/yyyy"));
Console.WriteLine("\t" + "\t1-uge");
Console.WriteLine("\t LYN-LOTTO\t");
Console.WriteLine(" ");
TalRækker.Print2DArray(TalRækker.?()); //here is the problem
Console.WriteLine("");
}
}
}
我很想使用锯齿状数组来使其更容易处理。然后,我将所需的功能拆分为单独的方法,以便在存在重复项时允许递归:
static Random rnd = new Random();
public static int[][] GenerateTicket(int numberOfRows, int rowLength)
{
var lines = new int[numberOfRows][];
for (int i =0; i < lines.Length; i++)
{
lines[i] = GenerateLine(rowLength, lines);
}
return lines;
}
public static int[] GenerateLine(int rowLength, int[][] existingLines)
{
var newLine = new int[rowLength];
for (int j = 0; j < rowLength; j++)
{
newLine[j] = GenerateNumber(newLine);
}
var orderedLine = newLine.OrderBy(n => n).ToArray();
var exists = existingLines.Where(line => line != null).Any(line => line.SequenceEqual(orderedLine));
// If a line already exists, call the method again to generate a new line, otherwise return the line.
return exists ? GenerateLine(rowLength, existingLines) : orderedLine;
}
public static int GenerateNumber(int[] line)
{
var number = rnd.Next(1, 36);
// Check if the line already contains the number, if so, call the method again to generate a new number, otherwise return the number.
return line.Contains(number) ? GenerateNumber(line) : number;
}
public static void Print2DArray<T>(T[][] lines)
{
var lineNumber = 1;
for (int i=0; i < lines.Length; i++)
{
Console.Write(" {0:D2}.\t", lineNumber);
lineNumber++;
for (int j = 0; j < lines[i].Length; j++)
{
Console.Write("{0:D2} ", lines[i][j]);
}
Console.WriteLine();
}
}
更新
我在使用 SequenceEqual 之前对 newLine 进行了排序,以便将之前排序的行与此进行比较,从而正确返回 true/false。
我认为这是一个数组练习。否则我更愿意使用列表。
所以你可以做类似下面的事情。请注意每个函数如何遵循单一责任原则和访问修饰符的使用。
这是 Do-While 循环的一个很好的用例,因为您的条件取决于行生成的第一个结果。
我没有检查连续出现相同数字的情况,因为您没有在问题中说明这一点。
public class TalRækker
{
static Random rnd = new Random();
public static int[,] GenerateLotteryTicket(int totalLines, int lineLength)
{
int[,] lines = new int[totalLines, lineLength];
int[] newLine = new int[lineLength];
for (int i = 0; i < totalLines; i++)
{
do
{
newLine = GenerateLine(lineLength);
}
while (ExistInTicket(lines,newLine));
for (int j = 0; j < lineLength; j++)
{
lines[i,j] = newLine[j];
}
}
return lines;
}
private static int[] GenerateLine(int lineLength)
{
int[] row = new int[lineLength];
for (int i = 0; i < lineLength; i++)
{
row[i] = rnd.Next(1, 36);
}
return row;
}
private static bool ExistInTicket(int[,] ticket, int[] line)
{
bool rowMatchFound;
for(int i = 0; i < ticket.GetLength(0); i++)
{
rowMatchFound = true;
for (int j = 0; j < ticket.GetLength(1); j++)
{
if(ticket[i,j] != line[j])
{
rowMatchFound = false;
break;
}
}
if(rowMatchFound) return true;
}
return false;
}
public static void Print2DArray<T>(T[,] line)
{
var lineNumber = 1;
for (int i = 0; i < line.GetLength(0); i++)
{
Console.Write(" {0:D2}.\t", lineNumber);
for (int j = 0; j < line.GetLength(1); j++)
{
Console.Write("{0:D2} ", line[i, j]);
}
Console.WriteLine();
lineNumber++;
}
}
}