Обертка над массивом double[] - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, подскажите пожалуйста с решением задания. Само задание: Нужно организовать различные виды доступа к одним и тем же данным. Напишите класс Indexer, который создается как обертка над массивом double[], и открывает доступ к его подмассиву некоторой длины, начиная с некоторого элемента. Тесты, которые должен проходить класс:
Листинг программы
  1. [TestFixture]
  2. class Indexer_should
  3. {
  4. double[] array = new double[] { 1, 2, 3, 4 };
  5. [Test]
  6. public void HaveCorrectLength()
  7. {
  8. var indexer = new Indexer(array, 1, 2);
  9. Assert.AreEqual(2,indexer.Length);
  10. }
  11. [Test]
  12. public void GetCorrectly()
  13. {
  14. var indexer = new Indexer(array, 1, 2);
  15. Assert.AreEqual(2, indexer[0]);
  16. Assert.AreEqual(3, indexer[1]);
  17. }
  18. [Test]
  19. public void SetCorrectly()
  20. {
  21. var indexer = new Indexer(array, 1, 2);
  22. indexer[0] = 10;
  23. Assert.AreEqual(10,array[1]);
  24. }
  25. [Test]
  26. public void FailWithWrongArguments1()
  27. {
  28. Assert.Throws(typeof(ArgumentException), () => new Indexer(array, -1, 3));
  29. }
  30. [Test]
  31. public void FailWithWrongArguments2()
  32. {
  33. Assert.Throws(typeof(ArgumentException), () => new Indexer(array, 1, -1));
  34. }
  35. [Test]
  36. public void FailWithWrongArguments3()
  37. {
  38. Assert.Throws(typeof(ArgumentException), () => new Indexer(array, 1, 10));
  39. }
  40. [Test]
  41. public void FailWithWrongIndexing1()
  42. {
  43. var indexer = new Indexer(array, 1, 2);
  44. Assert.Throws(typeof(IndexOutOfRangeException), () => { var a = indexer[-1]; });
  45. }
  46. [Test]
  47. public void FailWithWrongIndexing2()
  48. {
  49. var indexer = new Indexer(array, 1, 2);
  50. Assert.Throws(typeof(IndexOutOfRangeException), () => { var a = indexer[10]; });
  51. }
  52. }
Такая реализация класса пока получилась:
Листинг программы
  1. public class Indexer
  2. {
  3. double[] arr;
  4. int start;
  5. public int Start
  6. {
  7. get { return start; }
  8. set
  9. {
  10. if (value < 0) throw new ArgumentException();
  11. if (value >= arr.Length) throw new ArgumentException();
  12. start = value;
  13. }
  14. }
  15. int length;
  16. public int Length
  17. {
  18. get { return length; }
  19. set
  20. {
  21. if (value < 0) throw new ArgumentException();
  22. if (value > arr.Length) throw new ArgumentException();
  23. length = value;
  24. }
  25. }
  26. public Indexer(double[] arr,int start, int length)
  27. {
  28. this.arr = arr.Skip(start).Take(length).ToArray();
  29. Start = start;
  30. Length = length;
  31. }
  32. public double this[int index]
  33. {
  34. set
  35. {
  36. if ((index < 0) || (index >= Length)) throw new ArgumentOutOfRangeException();
  37. arr[index] = value;
  38. }
  39. get
  40. {
  41. if ((index < 0) || (index >= Length)) throw new ArgumentOutOfRangeException();
  42. return arr[index];
  43. }
  44. }
  45. }
Проблема пока с этим тестом:
Листинг программы
  1. [Test]
  2. public void SetCorrectly()
  3. {
  4. var indexer = new Indexer(array, 1, 2);
  5. indexer[0] = 10;
  6. Assert.AreEqual(10,array[1]);
  7. }
Да и из формулировки задачи следует, что надо обеспечить доступ к одним и тем же данным. То есть нужно менять как-то передаваемый в конструкторе внешний массив, а не так как у меня это реализовано. Вопрос: Как это можно сделать? С учетом того, что ref здесь получается нельзя использовать и возврат и присвоение внешнему массиву измененного массива в каком-нибудь методе тоже нельзя. А нужно всё провернуть в конструкторе и индексаторе.
На всякий случай приведу ссылку на задание: https://ulearn.me/Course/cs2/Praktik...a-985b6424cc64

Решение задачи: «Обертка над массивом double[]»

textual
Листинг программы
  1. public Indexer(double[] arr,int start, int length)
  2. {
  3.     //this.arr = arr.Skip(start).Take(length).ToArray();
  4.     this.arr = arr;
  5.    
  6.     /* ... */
  7. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.769 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы