Как мы можем получить все числа из диапазона чисел, у которых есть цифра «x» на позиции «n».

Пример: мне нужно найти все билеты с номерами в диапазоне от 1000 до 100000, которые имеют цифру 5 в позиции 3-й цифры и 8 в позиции 5-й цифры.

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

0
Manik Arora 19 Фев 2016 в 13:34

4 ответа

Лучший ответ

Также петля, но скрытая:

var allNumbers = Enumerable.Range(1000, 100000 - 1000 + 1) // +1 to include 100000
    .Select(i => new { Number = i, String = i.ToString() })
    .Where(x => x.String.Length >= 5 && x.String[2] == '5' && x.String[4] == '8')
    .Select(x => x.Number)
    .ToList();
4
Tim Schmelter 19 Фев 2016 в 10:43

Поскольку строка - это не что иное, как список символов, вы можете запросить те элементы, которые имеют желаемые символы по заданным индексам:

var range = Enumerable.Range(lowerBound, upperBound - lowerBound + 1)
    .Select(x => x.ToString().PadLeft(6, '0'))

var result = range.Where(x => x[2] == '5' && x[4] ='8');

РЕДАКТИРОВАТЬ: имейте в виду, что этот подход изменяет семантику того, что такое третья или пятая цифра в вашем номере, поскольку PadLeft добавит нулевые символы впереди.

1
HimBromBeere 19 Фев 2016 в 12:06

Итак, вы хотите узнать все билеты, которые находятся в форме

0a5bc8

Где a, b, c - цифры [0..9]. Вы можете легко сгенерировать все элементы с помощью

  List<int> tickets = new List<int>(1000); // we know that there're 1000 such values

  for (int a = 0; a < 10; ++a) 
    for (int b = 0; b < 10; ++b) 
      for (int c = 0; c < 10; ++c) 
        tickets.Add(a * 10000 + b * 100 + c * 10 + 5008);

Без циклов и фильтрации - только поколения (если вы ищете эффективную реализацию )

4
Dmitry Bychenko 19 Фев 2016 в 10:58

Вы можете ввести эти известные числа в правильные позиции:

измените "nnnnn" на "nn5n8nn"

Затем вам нужно будет перебрать 1/100 чисел. Преобразуйте в строку, разделите на три части (подстроку) и снова объедините, добавив эти числа.

Enumerable.Range(100,900)
  .Select(i => i.ToString())
  .Select(s => new { 
         p1 = s.Substring(0, 2), 
         p2 = s.Substring(2, 1), 
         p3 = s.Substring(3)})
  .Select(p => Int32.Parse(p.p1 + "5" + p.p2 + "8" + p.p3))
0
Hans Kesting 19 Фев 2016 в 15:19