如何检查我的彩票是否相等?

问题描述 投票:0回答:2

在课堂上,我们目前正在制作彩票作为一个项目,我目前陷入了一个 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("");
        }
    }
}
c# equality
2个回答
1
投票

我很想使用锯齿状数组来使其更容易处理。然后,我将所需的功能拆分为单独的方法,以便在存在重复项时允许递归:

    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。


0
投票

我认为这是一个数组练习。否则我更愿意使用列表。

所以你可以做类似下面的事情。请注意每个函数如何遵循单一责任原则和访问修饰符的使用。

这是 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++;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.