Rivi.cs 2.25 KB
Newer Older
M1888's avatar
M1888 committed
1 2 3 4 5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
M1888's avatar
M1888 committed
6
using Medallion; // thread-safe staattinen Rand
M1888's avatar
M1888 committed
7 8 9 10 11 12 13 14 15

namespace Lottokone.Model
{
    public class Rivi
    {
        public short[] Numerot { get; set; }
        public Rivi()
        {
            Numerot = new short[7];
M1888's avatar
M1888 committed
16
            ArvoRivi();
M1888's avatar
M1888 committed
17 18
        }

M1888's avatar
10.4.  
M1888 committed
19 20 21 22 23 24 25 26 27 28 29 30
        public Rivi(short[] numerot)
        {
            if (numerot.Length != 7)
                throw new ArgumentException("Rivin pituus pitää olla 7 numeroa");
            Numerot = numerot;
        }

        public Rivi(Rivi r)
        {
            Numerot = r.Numerot;
        }

M1888's avatar
16.4.  
M1888 committed
31
        public virtual void ArvoRivi()
M1888's avatar
10.4.  
M1888 committed
32 33 34
        {
            Numerot = Array.ConvertAll(
                // otetaan numerot 1-40, järjestellään satunnaisesti, valitaan 7 ekaa, ja tehdään niistä taulukko
M1888's avatar
M1888 committed
35
                Enumerable.Range(1, 40).OrderBy(x => Rand.Next(0, Int32.MaxValue)).Take(7).ToArray(),
M1888's avatar
10.4.  
M1888 committed
36 37 38 39
                // Enumerable.Range tuottaa inttejä, jotka pitää sitten muuntaa shorteiksi
                Convert.ToInt16);

            // järjestellään rivi arpomisen jälkeen heti
M1888's avatar
M1888 committed
40
            // suuruusjärjestykseen, niin vertailu on myöhemmin nopeampaa
M1888's avatar
10.4.  
M1888 committed
41 42 43
            Array.Sort(Numerot);
        }

M1888's avatar
16.4.  
M1888 committed
44 45
        // tämä metodi tarkistaa, kuinka monta numeroa rivissä on oikein
        // annettuun riviin verrattuna
M1888's avatar
M1888 committed
46
        public virtual int Oikein(object obj)
M1888's avatar
10.4.  
M1888 committed
47 48 49 50 51
        {
            Rivi r = obj as Rivi;
            if (r == null)
                return 0;

M1888's avatar
16.4.  
M1888 committed
52
            return Numerot.Intersect(r.Numerot).Count();
M1888's avatar
10.4.  
M1888 committed
53 54
        }

M1888's avatar
M1888 committed
55 56 57 58 59 60
        public override bool Equals(object obj)
        {
            Rivi r = obj as Rivi;
            if (r == null)
                return false;

M1888's avatar
10.4.  
M1888 committed
61 62 63
            for (int i = 0; i < Numerot.Length; i++)
                if (Numerot[i] != r.Numerot[i])
                    return false;
M1888's avatar
M1888 committed
64

M1888's avatar
10.4.  
M1888 committed
65
            return true;
M1888's avatar
M1888 committed
66 67 68 69 70 71
        }

        public override int GetHashCode()
        {
            return 521069651 + EqualityComparer<short[]>.Default.GetHashCode(Numerot);
        }
M1888's avatar
10.4.  
M1888 committed
72 73 74 75 76 77 78 79 80 81 82

        public override string ToString()
        {
            string s = "[";

            foreach (short n in Numerot)
                s += $" {n} ";

            s += "]";
            return s;
        }
M1888's avatar
M1888 committed
83 84
    }
}