В какой коллекции хранить массивы

257
06 января 2018, 00:25

Не знаю в какой коллекции хранить список массивов. Объясняю суть моей задачи. Пишу игровой автомат Slot Machine (пишу для саморазвития),это тот автомат, где нажимаешь рычаг и тебе выпадает 3 (у меня) разных результата. У меня они в виде массива, типа {2,1,2}. Имеется функция генерации псевдослучайных чисел,возвращающая этот самый массив. Необходимо, чтобы этот массив проверялся с другими массивами на соответствие. Т.е. я создаю коллекцию выигрышных результатов со списком массивов побед, например, выпало {2,5,2} и сравнивается с выигрышным вариантом массива {2,5,2}. Так вот этих вариантов массивов у меня много и мне их нужно удобно хранить и изменять. Что для этого подойдет?

Answer 1

Окей, раз вам нужен быстрый поиск, то имеет смысл избавиться от массивов. Давайте закодируем каждую тройку в виде одного числа, и поместим эти числа в HashSet<int>. Кодирование выберем таким образом, чтобы соответствие было взаимно-однозначным.

Получаем следующую структуру данных:

class Combination : IComparable<Combination>, IEquatable<Combination>
{
    const int Max = 100;
    public uint Packed { get; }
    public int[] Triple { get; }
    private Combination(uint packed, int[] triple) => (Packed, Triple) = (packed, triple);
    public static Combination FromPacked(uint packed)
    {
        uint curr = packed;
        int[] triple = new int[3];
        triple[0] = (int)(curr % Max); curr = curr / Max;
        triple[1] = (int)(curr % Max); curr = curr / Max;
        triple[2] = (int)curr;
        if (curr >= Max)
            throw new ArgumentException("Incorrect packed value");
        return new Combination(packed, triple);
    }
    public static Combination FromTriple(int[] triple)
    {
        if (triple == null)
            throw new ArgumentNullException(nameof(triple));
        if (triple.Length != 3)
            throw new ArgumentException("Triple has wrong length");
        uint packed = 0;
        for (int i = 2; i >= 0; i--)
        {
            var v = triple[i];
            if (v < 0 || v >= Max)
                throw new ArgumentException("Wrong value in triple");
            packed = packed * Max + (uint)v;
        }
        return new Combination(packed, triple);
    }
    #region всяческие сравнения, для удобства
    public bool Equals(Combination other) => other?.Packed.Equals(Packed) ?? false;
    public int CompareTo(Combination other) =>
        other == null ? 1 : Packed.CompareTo(other.Packed);
    public override bool Equals(object obj) => Equals(obj as Combination);
    public override int GetHashCode() => Packed.GetHashCode();
    public static bool operator ==(Combination l, Combination r) =>
        (l is null) ? (r is null) : l.Equals(r);
    public static bool operator !=(Combination l, Combination r) => !(l == r);
    #endregion
}

Теперь вы можете хранить в памяти HashSet<int>, в котором держать значение Packed.

Константу Max подправьте под ваши реальные цифры.

Answer 2

Если вопрос стоит в удобстве хранения и изменения. то как вариант:

class MyResults
{
    public int Primera { get; set; }
    public int Segundo { get; set; }
    public int Tercera { get; set; }
    public bool Equals(object obj)
    {
        if(obj is MyResults res)
            if (this.Primera == res.Primera && this.Segundo == res.Segundo && this.Tercera == res.Tercera)
                return true;
        return false;
    }
}
И создаем коллекцию
List<MyResults> res = new List<MyResults>(128);
        res.Add(new MyResults {Primera= 1,Segundo= 2,Tercera= 3 })
        res.Add(new MyResults { Primera = 3, Segundo = 2, Tercera = 3 });
        Console.WriteLine(res[0].equals(comparable));

Можно добавить конструктор принимающий интовый массив, или перегрузить equals чтобы так же принимал интовый массив.

По скорости работы коллекций: https://habrahabr.ru/sandbox/25117/

p.s ArrayList устаревший формат и проигрывает в скорости List при работе со значимыми типами, т.к кастит их в object;

Answer 3

Как мне кажется, коллекция Lookup<K,V> идеально подходит для такого случая. Всё искал куда ее можно удобно применить и вот он случай)

https://msdn.microsoft.com/ru-ru/library/bb460184(v=vs.110).aspx

READ ALSO
Табличный вывод данных из MS SQL в консоль

Табличный вывод данных из MS SQL в консоль

Доброго времени суток, столкнулся с проблемой вывода результата в табличном представлении в консоль, есть запрос:

246
Использование Net.Core библиотек в Net.Framewok

Использование Net.Core библиотек в Net.Framewok

Возможно ли использование библиотеки написанной вNet Core в проекте

243
Сохранение из Xml файла в базу данных mysql

Сохранение из Xml файла в базу данных mysql

Добрый день! Прошу сразу не кидать камнямиДля лабораторной работы необходимо импортировать и экспортировать данные из таблицы базы данных

268
Подскажите &ldquo;защиту&rdquo; dll в из Appdomain

Подскажите “защиту” dll в из Appdomain

Хотя бы от того же MegaDumper уберечь на первое время - Предложенный код

271