获取在'n'位置具有'x'数字的范围之间的数字

时间:2016-02-19 10:34:06

标签: c# .net

我们怎样才能获得所有数字范围之间的所有数字,这些数字在'第n'位数都有'x'数字。

示例:我需要查找编号介于1000到100000之间的所有票证,其中第3位数字位数为5,第5位数字位数为8位。

我认为应该有一个更好的选择,而不是循环所有门票以匹配正确的门票,或者这是我一直在做的唯一方式?

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:4)

所以你想找出所有形式的门票

  

0a5bc8

其中abc是数字[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);

没有循环和过滤 - 只有几代人(如果您正在寻找高效实施

答案 2 :(得分:1)

由于字符串只是一个字符列表,您可以查询在给定索引处具有所需字符的那些元素:

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');

编辑:请注意,此appraoch会更改您的号码中第三个或第五个数字的语义,因为PadLeft会在前面添加零个字符。

答案 3 :(得分:0)

您可以将这些已知数字注入正确的位置:

  

改变&#34; nnnnn&#34;进入&#34; nn5n8nn&#34;

然后你需要循环遍历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))