2008-10-06 13 views
10

Muszę być w stanie zweryfikować ciąg znaków przed listą możliwych skrótów stanu Poczty Stanów Zjednoczonych, a Google nie oferuje mi żadnego kierunku.Sprawdzanie poprawności ciągu znaków w stosunku do USPS Skróty stanowe

Wiem o oczywistym rozwiązaniu: a jest to zakodowanie strasznie wielkiego, jeśli (lub przełączającego) oświadczenia, aby sprawdzić i porównać ze wszystkimi 50 stanami, ale pytam StackOverflow, ponieważ musi być łatwiejszy sposób robienia to. Czy istnieje jakiś obiekt RegEx lub enumerator, który mógłbym użyć, aby szybko to zrobić w najbardziej efektywny sposób?

[C# i .NET 3.5 przy okazji]

List of USPS State Abbreviations

+1

Przy okazji, kilka z tych "stanów" jest teraz niezależnymi krajami. Sfederowane Stany Mikronezji, Wyspy Marshalla i jedna lub dwie z tych wysp na Pacyfiku. – Craig

Odpowiedz

18

lubię coś takiego:

private static String states = "|AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|"; 

public static bool isStateAbbreviation (String state) 
{ 
    return state.Length == 2 && states.IndexOf(state) > 0; 
} 

Metoda ta ma tę zaletę, że przy użyciu zoptymalizowanego rutynowych systemu, który jest prawdopodobnie przy użyciu jednego urządzenia instrukcja do wyszukiwania. Gdybym miał do czynienia ze słowami o stałej długości, to sprawdziłbym "|" + stan + "|" aby upewnić się, że nie trafiłem na podłańcuch zamiast pełnego dopasowania. Trochę to potrwa nieco dłużej, ze względu na konkatenację ciągów, ale nadal będzie pasować w ustalonym czasie. Jeśli chcesz sprawdzać poprawność małych i wielkich liter, sprawdź stan .Podręcznik() lub podwaj ciąg "stany", aby uwzględnić małe litery.

Gwarantuję, że będzie to pobić Regex lub Hashtable wyszukiwań za każdym razem, bez względu na to, ile zrobisz, a będzie to najmniej zużycie pamięci.

+0

Co się stanie, jeśli użytkownik wprowadzi "L |" jako ich wejście? Wyobrażam sobie, że byłaby to walidacja zgodnie z tym kodeksem. Można go łatwo naprawić za pomocą linii IndexOf ("|"). –

+1

Ponownie, jeśli się o to martwisz, to wtedy łączymy ograniczniki wokół ciągu wyszukiwania. W ten sposób sprawdzalibyśmy "| L ||", co nie byłoby możliwe. –

3

Oto regex. Cieszyć się!

^(?-i:A[LKSZRAEP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$ 
+2

Rekwizyty na chłodnym regexie, ale to po prostu śmieszne. Nie sądzę, że regex jest drogą do zrobienia - niezwykle trudno jest to zweryfikować wzrokiem, a każdy test, który napiszesz, aby zweryfikować, że działa, jest prawdopodobnie gorszy niż wdrożenie go w jaśniejszy sposób. –

+1

Niektórzy ludzie, gdy stają w obliczu problemu, myślą: "Wiem, użyję wyrażeń regularnych". Teraz mają dwa problemy. - Jamie Zawinski. –

+0

Tylko heads-up: ten regex zawiera wiele skrótów, które nie są powszechnie uważane, takie jak Portoryko, Mariany Północne, Palau i Wyspy Marshalla. – hughdbrown

15

bym zapełnić hashtable z ważnych skrótów, a następnie sprawdzić je z wejściem do walidacji. Jest znacznie czystszy i prawdopodobnie szybszy, jeśli masz więcej niż jedno sprawdzenie na kompilację słownika.

+0

Zdecydowano się na czyste i szybkie rozwiązanie. Poświęć trochę czasu na projekt i nadrobić zaległości w czasie pracy! – Craig

+0

Dzięki za wyjaśnienie konkretnych leków generycznych, Jon. –

8

Łańcuch HashSet < jest najczystszym sposobem na wykorzystanie wbudowanych typów w .NET 3.5. (Można również łatwo ustawić wielkość znaków niewrażliwych na wielkość znaków lub zmienić w łańcuch znaków Dictionary <, ciąg >, gdzie wartość jest pełną nazwą. To byłoby również najbardziej odpowiednie rozwiązanie dla .NET 2.0/3.0.)

Co do prędkości - czy naprawdę wierzysz, że będzie to wąskie gardło w twoim kodzie? HashSet może wykonywać "całkiem dobrze" (wiele milionów wyszukiwań na sekundę). Jestem pewien, że alternatywy byłyby jeszcze szybsze - ale brudniejsze. Trzymałbym się najprostszej rzeczy, która działa, dopóki nie będziesz miał powodów, by sądzić, że to będzie wąskie gardło.

(Zmieniano jawnie wspomnieć Słownik <,>).

Powiązane problemy