获取在“n”位置具有“x”位的范围之间的数字
本文关键字:范围 之间 数字 位置 获取 | 更新日期: 2023-09-27 18:35:18
我们如何获得数字范围之间的所有数字,这些数字在其"n"位位置都有"x"位。
示例:我需要找到所有编号在 1000 到 100000 之间的票证,其中第 3 位数字为 5,第 5 位数字为 8。
我相信应该有一个更好的选择,而不是循环遍历所有票证以匹配正确的票证,或者这是我一直在做的唯一方法?
也是一个
循环,但隐藏了:
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();
所以你想找出所有表格中的票证
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);
没有循环和过滤 - 只有世代(如果您正在寻找有效的实现)
由于字符串只不过是一个字符列表,您可以查询那些在给定索引处具有所需字符的元素:
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
将在前面添加零字符。
您可以将这些已知数字注入正确的位置:
将"nnnn"更改为"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))