Обертка над массивом double[] - C#
Формулировка задачи:
Здравствуйте, подскажите пожалуйста с решением задания.
Само задание:
Нужно организовать различные виды доступа к одним и тем же данным. Напишите класс Indexer, который создается как обертка над массивом double[], и открывает доступ к его подмассиву некоторой длины, начиная с некоторого элемента.
Тесты, которые должен проходить класс:
Такая реализация класса пока получилась:
Проблема пока с этим тестом:
Да и из формулировки задачи следует, что надо обеспечить доступ к одним и тем же данным. То есть нужно менять как-то передаваемый в конструкторе внешний массив, а не так как у меня это реализовано.
Вопрос: Как это можно сделать? С учетом того, что
Листинг программы
- [TestFixture]
- class Indexer_should
- {
- double[] array = new double[] { 1, 2, 3, 4 };
- [Test]
- public void HaveCorrectLength()
- {
- var indexer = new Indexer(array, 1, 2);
- Assert.AreEqual(2,indexer.Length);
- }
- [Test]
- public void GetCorrectly()
- {
- var indexer = new Indexer(array, 1, 2);
- Assert.AreEqual(2, indexer[0]);
- Assert.AreEqual(3, indexer[1]);
- }
- [Test]
- public void SetCorrectly()
- {
- var indexer = new Indexer(array, 1, 2);
- indexer[0] = 10;
- Assert.AreEqual(10,array[1]);
- }
- [Test]
- public void FailWithWrongArguments1()
- {
- Assert.Throws(typeof(ArgumentException), () => new Indexer(array, -1, 3));
- }
- [Test]
- public void FailWithWrongArguments2()
- {
- Assert.Throws(typeof(ArgumentException), () => new Indexer(array, 1, -1));
- }
- [Test]
- public void FailWithWrongArguments3()
- {
- Assert.Throws(typeof(ArgumentException), () => new Indexer(array, 1, 10));
- }
- [Test]
- public void FailWithWrongIndexing1()
- {
- var indexer = new Indexer(array, 1, 2);
- Assert.Throws(typeof(IndexOutOfRangeException), () => { var a = indexer[-1]; });
- }
- [Test]
- public void FailWithWrongIndexing2()
- {
- var indexer = new Indexer(array, 1, 2);
- Assert.Throws(typeof(IndexOutOfRangeException), () => { var a = indexer[10]; });
- }
- }
Листинг программы
- public class Indexer
- {
- double[] arr;
- int start;
- public int Start
- {
- get { return start; }
- set
- {
- if (value < 0) throw new ArgumentException();
- if (value >= arr.Length) throw new ArgumentException();
- start = value;
- }
- }
- int length;
- public int Length
- {
- get { return length; }
- set
- {
- if (value < 0) throw new ArgumentException();
- if (value > arr.Length) throw new ArgumentException();
- length = value;
- }
- }
- public Indexer(double[] arr,int start, int length)
- {
- this.arr = arr.Skip(start).Take(length).ToArray();
- Start = start;
- Length = length;
- }
- public double this[int index]
- {
- set
- {
- if ((index < 0) || (index >= Length)) throw new ArgumentOutOfRangeException();
- arr[index] = value;
- }
- get
- {
- if ((index < 0) || (index >= Length)) throw new ArgumentOutOfRangeException();
- return arr[index];
- }
- }
- }
Листинг программы
- [Test]
- public void SetCorrectly()
- {
- var indexer = new Indexer(array, 1, 2);
- indexer[0] = 10;
- Assert.AreEqual(10,array[1]);
- }
ref
здесь получается нельзя использовать и возврат и присвоение внешнему массиву измененного массива в каком-нибудь методе тоже нельзя. А нужно всё провернуть в конструкторе и индексаторе.
На всякий случай приведу ссылку на задание:
https://ulearn.me/Course/cs2/Praktik...a-985b6424cc64
Решение задачи: «Обертка над массивом double[]»
textual
Листинг программы
- public Indexer(double[] arr,int start, int length)
- {
- //this.arr = arr.Skip(start).Take(length).ToArray();
- this.arr = arr;
- /* ... */
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д