Обертка над массивом 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; /* ... */ }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д