C # Найти следующие X и предыдущие номера в последовательности - PullRequest
1 голос
/ 04 октября 2010

У меня есть список чисел, {1,2,3,4, ..., End}, где указан End.Я хочу отобразить X ближайших чисел вокруг заданного числа Find в списке.Если x нечетно, я хочу, чтобы дополнительная цифра шла больше стороны.

Пример (базовый регистр)

End: 6
X: 2
Find: 3

Результат должен быть: {2,3,4}

Другой пример (связанный случай):

End: 6
X: 4
Find: 5

Результат должен быть: {2,3,4,5,6}

Еще один пример (нечетный случай):

End: 6
X: 3
Find: 3

Результат должен быть: {2,3,4,5}

Я предполагаю, что было бы проще просто найти начальное и конечное значение, чем на самом делесоздание списка, но мне все равно, так или иначе.

Я использую C # 4.0, если это имеет значение.

Редактировать: я могу придумать, как это сделать,но это включает в себя слишком много, если, иначе, если дела.

if (Find == 1)
{
     Start = Find;
     Stop = (Find + X < End ? Find + X : End);
}
else if (Find == 2)
{
     if (X == 1)
     {
          Start = Find;
          End = (Find + 1 < End ? Find + 1 : End);
     }
     ...
 }

Вы можете надеяться увидеть, куда это идет.Я предполагаю, что мне придется использовать (X% 2 == 0) для проверки четности / четности.Затем некоторые ограничения, такие как less = Find - X/2 и more = Find + X/2.Я просто не могу определить путь наименьшего числа случаев.

Правка II: Я также должен уточнить, что я на самом деле не создаю список {1,2,3,4 ... Конец}, но, возможно, мне нужно просто начать с Find-X / 2.

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

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

Глядя на ваше попытанное решение, я думаю, что вам нужно выяснить алгоритм, который вам нужен, прежде чем пытаться кодировать то, что может или не может решитьтвоя проблема.Как вы сами говорите, написание одного оператора if для каждой возможной перестановки на входе не является управляемым решением.Вам нужно найти алгоритм, достаточно общий, чтобы вы могли использовать его для любого ввода, который вы получили, и при этом получить правильные результаты .

По сути, есть два вопроса, которые вам нужноответьте, прежде чем сможете написать работающее решение.

  1. Как найти нижнюю границу списка, который я хочу вернуть?
  2. Как найти верхнюю границуграницу списка, который я хочу вернуть?

Рассматривая пример базового случая, вы знаете, что данный параметр X содержит число, указывающее, сколько чисел вокруг Find вы должны отобразить.Поэтому вам нужно разделить X поровну по обеим сторонам Find.

Таким образом:

  1. Если я получу вход X = 4 и Find = 3, нижняя границабудет 3 - 4/2 или Find - X/2.
  2. Верхняя граница будет 3 + 4/2 или Find + X/2.

Начните с написания программы, которая работает и работает для базового варианта. Как только это будет сделано , сядьте и выясните, как найти верхнюю и нижнюю границы для более сложного случая.

Удачи!

2 голосов
/ 04 октября 2010

Вы можете посмотреть на методы расширения. пропустить и взять.

x.Skip(3).Take(4);

это поможет вам в том, что вы пытаетесь сделать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...