Я пытаюсь добиться этого результата:
LOWEST LOW MEDIUM HIGH HIGHEST HIGHEST HIGH MEDIUM LOW LOWEST
Я знаю, что есть много способов сделать это, но я пробую это в одном цикле, достижимо ли это?
Мой код в основном такой:
class Program {
static void Main()
{
string[] phases = ["LOWEST", "LOW", "MEDIUM", "HIGH", "HIGHEST"];
int fullRotation = (phases.Length - 1) * 2;
for (int i = 0; i <= fullRotation; i++)
{
int index;
if (i <= (phases.Length - 1))
{
index = i;
}
else
{
index = fullRotation - i;
}
Console.Write(phases[index] + " ");
}
}
}
Я получаю:
LOWEST LOW MEDIUM HIGH HIGHEST HIGH MEDIUM LOW LOWEST
^^ dotnetfiddle.net/cL1n5l , также работает с массивами четной длины: dotnetfiddle.net/amXUXF
Если бы вы использовали два цикла, код был бы намного понятнее. Почему это требование?
Вместо циклов можно использовать строковые функции. Здесь я использую Join
и Reverse
var result = string.Join(" ", phases) + " " + string.Join(" ", phases.Reverse());
ИЛИ (гораздо более простая версия)
var result = string.Join(" ", phases.Concat(phases.Reverse()));
ИЛИ (с использованием одиночного цикла for)
var result = "";
var length = phases.Length;
for (int i = 0; i < 2 * length; i++)
{
if (i < length)
{
result += phases[i] + " ";
}
else
{
result += phases[2 * length - 1 - i] + (i == 2 * length - 1 ? "" : " ");
}
}
Ваш цикл имеет fullRotation + 1
(т. е. (phases.Length - 1) * 2 + 1
) итераций из-за сравнения <=
. Но у него должна быть еще одна итерация (т. е. (phases.Length) * 2
).
Я бы сделал:
int fullRotation = phases.Length * 2;
for (int i = 0; i < fullRotation; i++)
Теперь этот цикл имеет phases.Length * 2
итераций. Но вычисление в ветке else
теперь смещено на 1, поэтому вам также следует вычесть 1:
else {
index = fullRotation - i - 1;
// ^^^^
}
Я ценю, что вместо того, чтобы изменить весь код, вы просто исправили предоставленный мной код. Огромное тебе спасибо, чувак!
string[] phases = ["LOWEST", "LOW", "MEDIUM", "HIGH", "HIGHEST"];
for (int i = 0; i < phases.Length*2; i++)
{
if (i < phases.Length)
{
Console.Write(phases[i]+" ");
}
else
{
Console.Write(phases[phases.Length * 2 - 1 - i] + " ");
}
}
Тест
При запросе я предлагаю использовать Linq; в нашем случае
string[] phases = ["LOWEST", "LOW", "MEDIUM", "HIGH", "HIGHEST"];
мы хотим выполнить итерацию вперед, а затем назад:
var query = phases // <- forward
.Concat(phases.Reverse()); // <- backward
имея query
, мы можем построить окончательную строку с помощью string.Присоединяйтесь:
var result = string.Join(" ", query);
Объединив все вместе:
using System.Linq;
class Program {
static void Main() {
string[] phases = ["LOWEST", "LOW", "MEDIUM", "HIGH", "HIGHEST"];
Console.Write(string.Join(" ", phases.Concat(phases.Reverse())));
}
}
Пожалуйста, поиграйте сами.
Давайте разберем вашу проблему:
У вас есть массив из 5 элементов с индексами от 0 до 4. Это очевидно.
Вы хотите повторить его дважды (от начала до конца и наоборот), поэтому вам понадобится 10 итераций (5 элементов в одну сторону и 5 элементов в другую сторону).
Вы определили int fullRotation = (phases.Length - 1) * 2;
, что в нашем случае равно 8. Это меньше 10, НО вы используете инклюзивные границы цикла, то есть от 0 до fullRotation
включительно, что дает 9 итераций. Но ЭТО ЕЩЁ МЕНЬШЕ, ЧЕМ потребовалось 10 итераций.
Вы уже можете видеть, откуда возникла ошибка.
Когда индекс цикла i
достигает значения 4, он будет использовать последний элемент (if (i <= (phases.Length - 1))
удовлетворен).
После этого i
переворачивается на 5, а затем мы доходим до этой строки index = fullRotation - i
, которая в результате дает 3. Таким образом, он используется для доступа к предпоследнему элементу.
Затем, как и ожидалось, i
снижается до 0, поэтому в конце печатается первый элемент массива — все хорошо.
Итак, мы обнаружили нашу ошибку, и чтобы исправить ее, мы можем просто немного подправить ваш код:
int fullRotation = phases.Length * 2 - 1
Изменение заключается в том, чтобы просто поставить -1
за скобками, потому что цель этого вычитания — учесть дополнительный индекс в позиции 0. Вот почему нам нужно применить его «один раз».
У вас 5 записей, поэтому вам нужно 10 индексов, а не 9. Кроме того, вам нужно придумать функцию, которая принимает входные данные, например, от 0 до 9 и выдает выходные данные от 0 до 4, а затем от 4 до 0. Вот и все. .