Найти первый и последний номер в диапазоне чисел - PullRequest
0 голосов
/ 30 апреля 2019

Представьте себе диапазон чисел от -133 до + 71.

Я хочу найти первые и последние числа в диапазоне, которые делятся на 20: в этом случае это будут -120 и +60.

Я могу написать цикл For, который проверяет каждое значение и сохраняет необходимые значения:

Dim resultFirst, resultLast As Integer
Dim FirstFound As Boolean = False
For a As Integer = -133 To 71
    If a Mod 20 = 0 Then
        If FirstFound = False Then
            resultFirst = a
            FirstFound = True
        End If
        resultLast = a
    End If
Next

, но я подозреваю, что есть более простая формула.

Ответы [ 3 ]

4 голосов
/ 30 апреля 2019

Можно использовать Enumerable.Range() и методы LINQ Where, Min и Max

Dim resultFirst As Integer
Dim resultLast As Integer
Dim min As Integer = -133
Dim max As Integer = 71
Dim div As Integer = 20

resultFirst = Enumerable.Range(min, max - min + 1).Where(Function(x) x Mod div = 0).Min()
resultLast = Enumerable.Range(min, max - min + 1).Where(Function(x) x Mod div = 0).Max()
1 голос
/ 30 апреля 2019

Попробуйте это

  Dim s As IEnumerable(Of Integer) =
                Enumerable.Range(-133, 133 + 72)

        Dim minV As Integer = s.AsEnumerable().Where(Function(n) n Mod 20 = 0).Min(Function(n) n)

        Dim maxV As Integer = s.AsEnumerable().Where(Function(n) n Mod 20 = 0).Max(Function(n) n)

        Console.WriteLine(minV.ToString() & " " & maxV.ToString())
        Console.ReadLine()
1 голос
/ 30 апреля 2019

Вы можете использовать следующее для получения первого и последнего значения, которое делится на 20:

Dim fromValue As Integer = -133
Dim first As Integer = (fromValue - (fromValue Mod 20)) + IIf(fromValue > 0 And fromValue Mod 20 <> 0, 20, 0)

Dim toValue As Integer = 71
Dim last As Integer = (toValue - (toValue Mod 20)) - IIf(toValue < 0 And toValue Mod 20 <> 0, 20, 0)

Вы также можете создать функцию, используя приведенную выше формулу:

Private Function GetResult(ByVal fromInt As Integer, ByVal toInt As Integer, ByVal divider As Integer) As Integer()

    'set the real from and to value from parameter.
    Dim fromValue As Integer = Math.Min(fromInt, toInt)
    Dim toValue As Integer = Math.Max(fromInt, toInt)

    'get the first and last number dividable by divider between numbers.
    Dim first As Integer = (fromValue - (fromValue Mod divider)) + IIf(fromValue > 0 And fromValue Mod divider <> 0, divider, 0)
    Dim last As Integer = (toValue - (toValue Mod divider)) - IIf(toValue < 0 And toValue Mod divider <> 0, divider, 0)

    If first > toValue Or last < fromValue Then
        Return {}
    Else
        Return {first, last}
    End If
End Function

Некоторые тестовые случаи для вышеуказанной функции:

GetResult(-133, 71, 20)   '0: -120; 1: 60
GetResult(71, -133, 20)   '0: -120; 1: 60
GetResult(100, 119, 20)   '0: 100;  1: 100
GetResult(-113, -112, 20) 'empty array
GetResult(120, 140, 20)   '0: 120;  1: 140
...