c# - 如何在 C# 中创建加拿大邮政编码范围生成器
问题描述
在过去的 24 小时里,我一直在尝试想出一个工具来输出一组加拿大邮政编码之间的所有邮政编码。
假设开始是 A1A1A1,结束是 A1A1B3。
我需要它来吐出如下列表
- A1A1A1
- A1A1A2
- A1A1A3
- A1A1A4
- A1A1A5
- A1A1A6
- A1A1A7
- A1A1A8
- A1A1A9
- A1A1B0
- A1A1B1
- A1A1B2
- A1A1B3
加拿大邮政编码不能包含字母 D、F、I、O、Q 或 U,并且不能以 W 或 Z 开头:
[ABCEGHJKLMNPRSTVXY][0-9][ABCEGHJKLMNPRSTVWXYZ][0-9][ABCEGHJKLMNPRSTVWXYZ][0-9]
有什么帮助吗?
编辑:
这是我的一些代码(不是很多)。首先,我写了一个小班,它会给我带有某种 ID/订单的有效加拿大字母。我想这将用于在我增加时帮助找到下一个字母。我的第一个想法是我可以使用某种递归方法,这样我就不必编写所有 If/Else 案例。
public class CanadaLetters
{
public int i { get; set; }
public string letter { get; set; }
}
public CanadaLetters[] CLetters = new CanadaLetters[]{
new CanadaLetters() {i = 1, letter = "A"},
new CanadaLetters() {i = 2, letter = "B"},
new CanadaLetters() {i = 3, letter = "C"},
new CanadaLetters() {i = 4, letter = "E"},
new CanadaLetters() {i = 5, letter = "G"},
new CanadaLetters() {i = 6, letter = "H"},
new CanadaLetters() {i = 7, letter = "J"},
new CanadaLetters() {i = 8, letter = "K"},
new CanadaLetters() {i = 9, letter = "L"},
new CanadaLetters() {i = 10, letter = "M"},
new CanadaLetters() {i = 11, letter = "P"},
new CanadaLetters() {i = 12, letter = "R"},
new CanadaLetters() {i = 13, letter = "S"},
new CanadaLetters() {i = 14, letter = "T"},
new CanadaLetters() {i = 15, letter = "V"},
new CanadaLetters() {i = 15, letter = "W"},
new CanadaLetters() {i = 16, letter = "X"},
new CanadaLetters() {i = 17, letter = "Y"},
new CanadaLetters() {i = 17, letter = "Z"},
};
这是我的代码的开始。我想我会将邮政编码分解为一个字符串数组并向后工作。
var begin = "A1A1A1";
var end = "Z9Z9Z9";
while (begin != end)
{
var postalCode = begin.ToCharArray().Select(c => c.ToString()).ToArray();
for (int i = postalCode.Length; i < 0; i--)
{
if (int.TryParse(postalCode[i], out var ii))
{
if (ii == 9)
{
postalCode[i] = "0";
}
}
}
tbAllPostalCodes.Text += begin + Environment.NewLine;
}
解决方案
一个直接的解决方案可以是这样的
private static readonly char[] LegalChars = {
'A', 'B', 'C', 'E', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z'
};
// Credits to @Toni for notifying me about this part of the the specs
private static readonly char[] LevelOneForbiddenChars = { 'W', 'Z' };
public static IList<string> GetLetterNumberPairs(string stopAt, bool firstLevel = false)
{
var result = new List<string>();
foreach (var currentChar in LegalChars)
{
if (firstLevel && LevelOneForbiddenChars.Contains(currentChar))
{
continue;
}
for (var j = 1; j < 10; j++)
{
var currentLetterAndNumber = $"{currentChar}{j}";
result.Add(currentLetterAndNumber);
if (stopAt.Equals(currentLetterAndNumber))
{
return result;
}
}
}
return result;
}
[Test]
public void PostalCodeTest()
{
foreach (var level1 in GetLetterNumberPairs("A1", true))
{
foreach (var level2 in GetLetterNumberPairs("A1"))
{
foreach (var level3 in GetLetterNumberPairs("B3"))
{
Console.WriteLine($"{level1}{level2}{level3}");
}
}
}
}
输出:
A1A1A1
A1A1A2
A1A1A3
A1A1A4
A1A1A5
A1A1A6
A1A1A7
A1A1A8
A1A1A9
A1A1B1
A1A1B2
A1A1B3
不确定您的规格0
。
推荐阅读
- macos - SwiftUI 剪切命令验证
- android - AlarmManager 在 MIUI 上不起作用(谁知道还有哪里)
- python - 数据框将列中的值转换为列名称
- ios - 如何使用swift将循环中的数组索引增加+1
- flutter - 边界半径被覆盖?图像渲染为矩形
- vba - 在 Power point 中运行宏。将其设置为使用 PS1 文件运行,但在 application.run cmd 上出现错误
- typescript - Typescript 两层联合类型推断泛型
- c - 如果程序将退出,使用临时 realloc 变量有什么意义?
- r - 为什么用 geom_text 标记 ggplot 绘图条的尝试不起作用?
- css - 使用 CSS 实现响应式纸张卷曲效果