Написать шаблонный класс для массива

Нужно написать шаблонный класс для массива, у которого параметризированный тип данных. Все бы ничего, но нужно еще создать конструктор, который с заданной длиной либо просто инициализирует массив, либо случайно его генерирует, и на этом моменте я застрял. Вот пока мой код, не знаю как правильно реализовать.

public class MyArray<T>
{
    private T[] array;
    private int size;

    public MyArray(int n, bool choice)
    {
        size = n;
        array = new T[size];
        if (choice)
        {
            Random rnd = new Random();
            for (int i = 0; i < size; i++)
            {
                array[i] = (T) rnd.Next();
            }
        }
    }

}

Помогите на примере чисел (int, long, float, double). Символы, строки и булевые не нужно.


Ответы (1 шт):

Автор решения: srvr4vr

Так как наш шаблонный класс знать не должен про то как генерировать тип который ему в параметр пихают потными ручонками, то заюзаем паттерн стратегия (Акция "Удиви препода!". Кстати, чтобы потом не было мучительно стыдно - почитайте на досуге про паттерны в целом и про стратегию в частности, ведь хороший препод обязательно спросит):

 public interface IGenerateStrategy<out T>
 {
     T Get();
 }

Для примера стратегии для типа int и float, остальные сочиняйте сами по мере необходимости:

public class IntGeneratorStrategy : IGenerateStrategy<int>
{
    private readonly Random _rnd = new Random();

    public int Get() => _rnd.Next();
}

public class FloatGeneratorStrategy : IGenerateStrategy<float>
{
    private readonly Random _rnd = new Random();

    public float Get()
    {
        var mantissa = _rnd.NextDouble() * 2.0 - 1.0;
        var exponent = Math.Pow(2.0, _rnd.Next(-126, 128));
        return (float)(mantissa * exponent);
    }
}

Наш класс:

public class MyArray<T>
{
    public T[] Array { get; }

    public MyArray(int n, IGenerateStrategy<T> generateStrategy = null)
    {
        var size = n;
        Array = new T[size];

        if (generateStrategy != null)
        {
            for (var i = 0; i < size; i++)
            {
                Array[i] = generateStrategy.Get();
            }
        }
    }
}

Если вторым параметром будет передана нужная стратегия - то элементы будут генерится стратегией и все зашибись, если ее нет - массив будет заполнен дефолтными значениями.

var intArray = new MyArray<int>(5); // 0,0,0,0,0
var intArrayRandom = new MyArray<int>(5, new IntGeneratorStrategy()); // 5 рандомных интов

var floatArray = new MyArray<float>(5); //по аналогии

var floatArrayRandom = new MyArray<float>(5, new FloatGeneratorStrategy());
→ Ссылка