Не знаю в какой коллекции хранить список массивов. Объясняю суть моей задачи. Пишу игровой автомат Slot Machine (пишу для саморазвития),это тот автомат, где нажимаешь рычаг и тебе выпадает 3 (у меня) разных результата. У меня они в виде массива, типа {2,1,2}. Имеется функция генерации псевдослучайных чисел,возвращающая этот самый массив. Необходимо, чтобы этот массив проверялся с другими массивами на соответствие. Т.е. я создаю коллекцию выигрышных результатов со списком массивов побед, например, выпало {2,5,2} и сравнивается с выигрышным вариантом массива {2,5,2}. Так вот этих вариантов массивов у меня много и мне их нужно удобно хранить и изменять. Что для этого подойдет?
Окей, раз вам нужен быстрый поиск, то имеет смысл избавиться от массивов. Давайте закодируем каждую тройку в виде одного числа, и поместим эти числа в 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
подправьте под ваши реальные цифры.
Если вопрос стоит в удобстве хранения и изменения. то как вариант:
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;
Как мне кажется, коллекция Lookup<K,V>
идеально подходит для такого случая. Всё искал куда ее можно удобно применить и вот он случай)
https://msdn.microsoft.com/ru-ru/library/bb460184(v=vs.110).aspx
Доброго времени суток, столкнулся с проблемой вывода результата в табличном представлении в консоль, есть запрос:
Возможно ли использование библиотеки написанной вNet Core в проекте
Добрый день! Прошу сразу не кидать камнямиДля лабораторной работы необходимо импортировать и экспортировать данные из таблицы базы данных
Хотя бы от того же MegaDumper уберечь на первое время - Предложенный код