Нужно посчитать кол-во вхождений элементов в зубчатом массиве 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);
}
}
}