To tell the truth, the Pascal code is more concise. Pascal, VB, Ruby etc have means to test a range of values in a single case statement. Unfortunately C# doesn't provide for this contingency, hence the "fall through's" in the case blocks.
Anyway, maybe someone might find this useful as there are a few "interesting" situations with the ACT and NSW.
1 public static string GetState(string postCode) {
2 if (!IsValidPostCodeFormat(postCode))
3 return "";
4
5 switch (postCode[0]) {
6 case '5': return "SA"; // SA: 5000-5999
7 case '3':
8 case '8': return "VIC"; // VIC: 3000-3999, 8000-8999
9 case '4':
10 case '9': return "QLD"; // QLD: 4000-4999, 9000-9999
11 case '6': return "WA"; // WA: 6000-6999
12 case '7': return "TAS"; // TAS: 7000-7999
13 case '1': return "NSW"; // NSW: 1000-1999
14
15 case '0':
16 switch (postCode[1]) {
17 case '8':
18 case '9': return "NT"; // NT: 0800-0999
19 case '2': return "ACT"; // ACT: 0200-0299
20 default: return "";
21 }
22
23 case '2':
24 int tmp = Int32.Parse(postCode);
25 if ((tmp >= 2600 && tmp <= 2618) || (tmp >= 2900 && tmp <= 2920))
26 return "ACT"; // ACT: 2600-2618, 2900-2920
27 else if ((tmp >= 2000 && tmp <= 2599) || (tmp >= 2619 && tmp <= 2898)
28 || (tmp >= 2921 && tmp <= 2999))
29 return "NSW"; // NSW: 2000-2599, 2619-2898, 2921-2999
30 else return "";
31
32 default: return "";
33 }
34 }
35
36 private static bool IsValidPostCodeFormat(string postCode) {
37 int tmp;
38 if (String.IsNullOrEmpty(postCode) || postCode.Length != 4
39 || !Int32.TryParse(postCode, out tmp))
40 return false;
41
42 return true;
43 }
44