Нужно посчитать кол-во вхождений элементов в зубчатом массиве ranges

2-й день пытаюсь решить эту задачу. Пробовал по-разному, нужно с помощью цикла do while реализовать метод.
Кто сможет детально показать где и что не так? Прошу без камней в огород, если есть желание и опыт помочь, очень буду благодарен, если плохое настроение и хотите плеснуть сюда, пожалуйста, пройдите мимо.

Этот метод выполняет поиск в массиве десятичных знаков элементов, находящихся в указанном диапазоне, и возвращает количество вхождений элементов, соответствующих критериям диапазона.

Вот что пока реализовано:

    public static class DecimalCounter
    {
        /// <summary>
        /// Searches an array of decimals for elements that are in a specified range, and returns the number of occurrences of the elements that matches the range criteria.
        /// </summary>
        /// <param name="arrayToSearch">One-dimensional, zero-based <see cref="Array"/> of single-precision floating-point numbers.</param>
        /// <param name="ranges">One-dimensional, zero-based <see cref="Array"/> of range arrays.</param>
        /// <returns>The number of occurrences of the <see cref="Array"/> elements that match the range criteria.</returns>
        public static int GetDecimalsCount(decimal[] arrayToSearch, decimal[][] ranges)
        {
            if (arrayToSearch is null)
            {
                throw new ArgumentNullException(nameof(arrayToSearch));
            }

            if (ranges is null)
            {
                throw new ArgumentNullException(nameof(ranges));
            }

            if (ranges.Length == 0)
            {
                return 0;
            }

            int counter = 0;

            int idx = 0;
            // Method throws ArgumentException in case the length of one of the ranges is less or greater than 2.
            do
            {
                int i = 0;
                do
                {
                    if (ranges[i] == null)
                    {
                        throw new ArgumentNullException(nameof(ranges), "Argument Null Exception");
                    }   
                } while (++i < ranges.Length);
            } while (++idx < arrayToSearch.Length);
            return counter;
        }

введите сюда описание изображения введите сюда описание изображения
Я пытался там и сравнивать, и что только не делать, тесты не проходит. Остальные проверки проходят тест, все хорошо... Только вот с этим голову ломаю, прошу помочь...

Вот файл тестов

using System;
using NUnit.Framework;

#pragma warning disable CA1707

namespace LookingForArrayElements.Tests
{
    [TestFixture]
    public sealed class DecimalCounterTests
    {
        private static readonly decimal[] ArrayWithFiveElements = { 0.1m, 0.2m, 0.3m, 0.4m, 0.5m };
        private static readonly decimal[] ArrayWithFifteenElements = { decimal.MaxValue, -0.1m, -0.2m, decimal.One, -0.3m, -0.4m, -0.5m, decimal.Zero, 0.1m, 0.2m, 0.3m, 0.4m, 0.5m, decimal.MinusOne, decimal.MinValue };

        [Test]
        public void DecimalCounter_ArrayToSearchIsNull_ThrowArgumentNullException()
        {
            // Act
            Assert.Throws<ArgumentNullException>(
                () => DecimalCounter.GetDecimalsCount(null, Array.Empty<decimal[]>()),
                message: "Method throws ArgumentNullException in case array to search is null.");
        }

        [Test]
        public void DecimalCounter_ArrayOfRangesIsNull_ThrowArgumentNullException()
        {
            // Act
            Assert.Throws<ArgumentNullException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), null),
                message: "Method throws ArgumentNullException in case array of ranges is null.");
        }

        [Test]
        public void DecimalCounter_ArrayToSearchIsEmpty_ReturnZeroOccurrences()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
            };

            // Act
            int actual = DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges);

            // Assert
            Assert.AreEqual(0, actual);
        }

        [Test]
        public void DecimalCounter_ArrayOfRangesIsEmpty_ReturnZeroOccurrences()
        {
            // Act
            int actual = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, Array.Empty<decimal[]>());

            // Assert
            Assert.AreEqual(0, actual);
        }

        [Test]
        public void DecimalCounter_OneOfTheRangesIsNull_ThrowArgumentNullException()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                null,
            };

            // Act
            Assert.Throws<ArgumentNullException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges),
                message: "Method throws ArgumentNullException in case one of the ranges is null.");
        }

        [Test]
        public void DecimalCounter_OneOfTheRangesIsEmpty_ReturnValidResult()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                Array.Empty<decimal>(),
            };

            // Act
            int actual = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, ranges);

            // Assert
            Assert.AreEqual(2, actual);
        }

        [Test]
        public void DecimalCounter_OneOfTheRangesIsInvalid_ThrowArgumentException()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m, 0.6m },
            };

            // Act
            Assert.Throws<ArgumentException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges),
                message: "Method throws ArgumentException in case the length of one of the ranges is less or greater than 2.");
        }

        [Test]
        public void DecimalCounter_FiveElementsOneRange_ReturnsResult()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
            };

            // Act
            int actualResult = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, ranges);

            // Assert
            Assert.AreEqual(2, actualResult);
        }

        [Test]
        public void DecimalCounter_FiveElementsTwoRanges_ReturnsResult()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
            };

            // Act
            int actualResult = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, ranges);

            // Assert
            Assert.AreEqual(4, actualResult);
        }

        [Test]
        public void DecimalCounter_FiveElementsThreeRanges_ReturnsResult()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
                new[] { decimal.Zero, decimal.One },
            };

            // Act
            int actualResult = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, ranges);

            // Assert
            Assert.AreEqual(5, actualResult);
        }

        [Test]
        public void DecimalCounter_FifteenElementsOneRange_ReturnsResult()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { -0.1m, 0.2m },
            };

            // Act
            int actualResult = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFifteenElements, ranges);

            // Assert
            Assert.AreEqual(4, actualResult);
        }

        [Test]
        public void DecimalCounter_FifteenElementsTwoRanges_ReturnsResult()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { -0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
            };

            // Act
            int actualResult = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFifteenElements, ranges);

            // Assert
            Assert.AreEqual(6, actualResult);
        }

        [Test]
        public void DecimalCounter_FifteenElementsThreeRanges_ReturnsResult()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { -0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
                new[] { decimal.Zero, decimal.One },
            };

            // Act
            int actualResult = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFifteenElements, ranges);

            // Assert
            Assert.AreEqual(8, actualResult);
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_ArrayToSearchIsNull_ThrowArgumentNullException()
        {
            // Act
            Assert.Throws<ArgumentNullException>(
                () => DecimalCounter.GetDecimalsCount(null, Array.Empty<decimal[]>(), 0, 1),
                message: "Method throws ArgumentNullException in case array to search is null.");
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_ArrayOfRangesIsNull_ThrowArgumentNullException()
        {
            // Act
            Assert.Throws<ArgumentNullException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), null, 0, 1),
                message: "Method throws ArgumentNullException in case array of ranges is null.");
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_ArrayOfRangesIsEmpty_ReturnZeroOccurrences()
        {
            // Act
            int actual = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, Array.Empty<decimal[]>(), 0, 1);

            // Assert
            Assert.AreEqual(0, actual);
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_OneOfTheRangesIsNull_ThrowArgumentNullException()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                null,
            };

            // Act
            Assert.Throws<ArgumentNullException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges, 0, 1),
                message: "Method throws ArgumentNullException in case one of the ranges is null.");
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_OneOfTheRangesIsEmpty_ReturnValidResult()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                Array.Empty<decimal>(),
            };

            // Act
            int actual = DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, ranges, 0, 1);

            // Assert
            Assert.AreEqual(1, actual);
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_OneOfTheRangesIsInvalid_ThrowArgumentException()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m, 0.6m },
            };

            // Act
            Assert.Throws<ArgumentException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges, 0, 1),
                message: "Method throws ArgumentException in case the length of one of the ranges is less or greater than 2.");
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_StartIndexIsNegative_ThrowArgumentOutOfRangeException()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
            };

            // Act
            Assert.Throws<ArgumentOutOfRangeException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges, -1234, 1),
                message: "Method throws ArgumentOutOfRangeException in case start index is negative.");
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_StartIndexIsGreaterThanTheLengthOfAnArrayToSearch_ThrowArgumentOutOfRangeException()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
            };

            // Act
            Assert.Throws<ArgumentOutOfRangeException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges, 1234, 1),
                message: "Method throws ArgumentOutOfRangeException in case start index is greater than the length of an array to search.");
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_CountIsLessThanZero_ThrowArgumentOutOfRangeException()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
            };

            // Act
            Assert.Throws<ArgumentOutOfRangeException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges, 4, -1),
                message: "Method throws ArgumentOutOfRangeException in case count is less than zero.");
        }

        [Test]
        public void DecimalCounterWithStartIndexAndCount_TheNumberOfElementsToSearchIsGreaterThanTheNumberOfElementsAvailableInTheArrayStartingFromTheStartIndexPosition_ThrowArgumentOutOfRangeException()
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
            };

            // Act
            Assert.Throws<ArgumentOutOfRangeException>(
                () => DecimalCounter.GetDecimalsCount(Array.Empty<decimal>(), ranges, 4, 100000),
                message: "Method throws ArgumentOutOfRangeException in case the number of elements to search is greater than the number of elements available in the array starting from the startIndex position.");
        }

        [TestCase(0, 5, ExpectedResult = 2)]
        [TestCase(0, 2, ExpectedResult = 2)]
        [TestCase(2, 3, ExpectedResult = 0)]
        public int DecimalCounter_FiveElementsOneRange_ReturnsResult(int startIndex, int count)
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
            };

            // Act
            return DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, ranges, startIndex, count);
        }

        [TestCase(0, 5, ExpectedResult = 4)]
        [TestCase(0, 0, ExpectedResult = 0)]
        [TestCase(0, 2, ExpectedResult = 2)]
        [TestCase(2, 3, ExpectedResult = 2)]
        [TestCase(2, 1, ExpectedResult = 0)]
        public int DecimalCounter_FiveElementsTwoRanges_ReturnsResult(int startIndex, int count)
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
            };

            // Act
            return DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, ranges, startIndex, count);
        }

        [TestCase(0, 5, ExpectedResult = 5)]
        [TestCase(0, 0, ExpectedResult = 0)]
        [TestCase(0, 2, ExpectedResult = 2)]
        [TestCase(2, 3, ExpectedResult = 3)]
        [TestCase(2, 1, ExpectedResult = 1)]
        public int DecimalCounter_FiveElementsThreeRanges_ReturnsResult(int startIndex, int count)
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { 0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
                new[] { decimal.Zero, decimal.One },
            };

            // Act
            return DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFiveElements, ranges, startIndex, count);
        }

        [TestCase(0, 15, ExpectedResult = 4)]
        [TestCase(0, 2, ExpectedResult = 1)]
        [TestCase(0, 0, ExpectedResult = 0)]
        [TestCase(2, 3, ExpectedResult = 0)]
        public int DecimalCounter_FifteenElementsOneRange_ReturnsResult(int startIndex, int count)
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { -0.1m, 0.2m },
            };

            // Act
            return DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFifteenElements, ranges, startIndex, count);
        }

        [TestCase(0, 15, ExpectedResult = 6)]
        [TestCase(0, 2, ExpectedResult = 1)]
        [TestCase(2, 3, ExpectedResult = 0)]
        [TestCase(10, 5, ExpectedResult = 2)]
        [TestCase(10, 0, ExpectedResult = 0)]
        public int DecimalCounter_FifteenElementsTwoRanges_ReturnsResult(int startIndex, int count)
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { -0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
            };

            // Act
            return DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFifteenElements, ranges, startIndex, count);
        }

        [TestCase(0, 15, ExpectedResult = 8)]
        [TestCase(0, 2, ExpectedResult = 1)]
        [TestCase(2, 3, ExpectedResult = 1)]
        [TestCase(10, 5, ExpectedResult = 3)]
        [TestCase(10, 0, ExpectedResult = 0)]
        public int DecimalCounter_FifteenElementsThreeRanges_ReturnsResult(int startIndex, int count)
        {
            // Arrange
            decimal[][] ranges =
            {
                new[] { -0.1m, 0.2m },
                new[] { 0.4m, 0.5m },
                new[] { decimal.Zero, decimal.One },
            };

            // Act
            return DecimalCounter.GetDecimalsCount(DecimalCounterTests.ArrayWithFifteenElements, ranges, startIndex, count);
        }
    }
}


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