Rivi.cs 2.5 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

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

M1888's avatar
M1888 committed
20 21
        public Rivi(short[] numerot)
        {
M1888's avatar
M1888 committed
22
            // jos saadaan taulukko numeroita, niin varmistetaan että pituus on oikea.
M1888's avatar
M1888 committed
23 24 25 26 27 28 29
            if (numerot.Length != 7)
                throw new ArgumentException("Rivin pituus pitää olla 7 numeroa");
            Numerot = numerot;
        }

        public Rivi(Rivi r)
        {
M1888's avatar
M1888 committed
30
            // olemassaolevalta riviltä kopioidaan numerot
M1888's avatar
M1888 committed
31 32 33
            Numerot = r.Numerot;
        }

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

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

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

M1888's avatar
M1888 committed
55
            return Numerot.Intersect(r.Numerot).Count();
M1888's avatar
M1888 committed
56 57
        }

M1888's avatar
M1888 committed
58
        // Jos rivin numerot on täysin samat, niin ne ovat sama rivi.
M1888's avatar
M1888 committed
59 60 61 62 63 64
        public override bool Equals(object obj)
        {
            Rivi r = obj as Rivi;
            if (r == null)
                return false;

M1888's avatar
M1888 committed
65 66 67
            for (int i = 0; i < Numerot.Length; i++)
                if (Numerot[i] != r.Numerot[i])
                    return false;
M1888's avatar
M1888 committed
68

M1888's avatar
M1888 committed
69
            return true;
M1888's avatar
M1888 committed
70 71 72 73 74 75
        }

        public override int GetHashCode()
        {
            return 521069651 + EqualityComparer<short[]>.Default.GetHashCode(Numerot);
        }
M1888's avatar
M1888 committed
76 77 78 79 80 81 82 83 84 85 86

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

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

            s += "]";
            return s;
        }
M1888's avatar
M1888 committed
87 88
    }
}