首页 > 解决方案 > 如何在 C# 中创建加拿大邮政编码范围生成器

问题描述

在过去的 24 小时里,我一直在尝试想出一个工具来输出一组加拿大邮政编码之间的所有邮政编码。

假设开始是 A1A1A1,结束是 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;


        }

标签: c#

解决方案


一个直接的解决方案可以是这样的

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


推荐阅读