2010-06-25 14 views
11

Czytam nazwę użytkownika, a następnie sprawdzam, czy istnieje w innej tabeli bazy danych, problem jest, gdy nazwa użytkownika jest taka sama, może być inna i uniemożliwia jej znalezienie pasującego przykładu. i JSmith lub JSMITH.C# Porównywanie ciągów z różnymi przypadkami

Jak mogę to naprawić? Czy powinienem obniżyć wielkość liter podczas zapisywania do pierwszej bazy danych, czy też mogę zmienić mój kod poniżej, kiedy porównuję te dwa?

drUser["Enrolled"] = 
    (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1); 

UPDATE:

Wciąż zmaga się z tym, kod poniżej kompilacji, ale nie daje poprawny wynik, podczas oglądania uczestniczących użytkowników widzę tych, którzy nie są zapisani, podczas oglądania tych, które nie są zapisałem Widzę 1, który jest zarejestrowany, ale ich nazwa użytkownika jest taka sama w każdej bazie danych. Czy poprawnie sformatowałem poniższy kod?

drUser["Enrolled"] = (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase))); 

Dzięki Jamie

+1

Dang, byłem zbyt wolny. Pomyślałem, że powinienem odpowiedzieć na to jedno;) – jsmith

+0

@jsmith: Co? – SLaks

+1

@SLaks jego przykładowa nazwa .. to moja nazwa użytkownika .. :) – jsmith

Odpowiedz

21

Trzeba CAL Equals method, która przyjmuje parametr StringComparison.

Na przykład:

x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase) 

Jeśli x.Username może być null, należy zadzwonić do static Equals method:

String.Equals(x.Username, (string)drUser["Username"], StringComparison.OrdinalIgnoreCase) 

Inaczej x.Username.Equals może rzucać NullReferenceException.

+0

Przepraszamy, ale brzmi grubo, ale poniższy kod nie działa poprawnie, ale kompiluje, ale nie znajduje pasujących użytkowników. drUser ["Enrolled"] = (enrolledUsers.FindIndex (x => x.Username.Equals ((string) drUser ["Username"], StringComparison.OrdinalIgnoreCase))); – Jamie

+0

Po prostu wypróbowałem aktualizację, a ta nie została skompilowana. Gdzie się mylę? drUser ["Enrolled"] = (enrolledUsers.FindIndex (String.Equals (x.Username, (string) drUser ["Username"], StringComparison.OrdinalIgnoreCase))); – Jamie

+0

Edytuj pytanie i dodaj dokładny kod. – SLaks

3

Preferowanym sposobem, aby to zrobić, to określić porównanie ciągów za pomocą coś jak

string.Equals(x.Username, (string)drUser["Username"], StringComparison.OrdinalIgnoreCase 

zrobić czek równość, zamiast "=="

+0

To się nie skomplikuje (zapomniałeś rzucić). – SLaks

+0

dobre miejsce - dzięki! –

0

Jak na temat korzystania ToUpper() .

if(!(dr["Enrolled"] == null || dr["Username"] == null)) 
{ 
    if(dr["Enrolled"].ToString().ToUpperInvariant()== dr["Username"].ToString().ToUpperInvariant()) 
    { 
     //Do Something 
    } 
} 
+0

proszę podać powód głosowania w dół. Chciałbym się dowiedzieć, dlaczego ten kod jest złą praktyką. Dzięki – MikeTWebb

+0

Nie zabrałem ci głosu, ale mogę zgadnąć dlaczego. Po pierwsze, wybuchnie, jeśli którakolwiek z wartości ma wartość null. Po drugie, nie jest to świadomość kulturowa. Może działać dla języka angielskiego (i wielu innych języków), ale nie dla wszystkich. Często przytaczanym przykładem jest "The Turkish Case": http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html . NET zapewnia kulturowo świadome porównania ciągów za darmo - Użyj ich! –

+0

Daleko ... dzięki za wyjaśnienie. Bardzo doceniane. Tak, jeśli chodzi o NULL-y ... przykład kodu nie miał być kuloodporny. Zawsze sprawdzam NULL. – MikeTWebb

0

Czy próbowałeś tego?

string userName = (string)drUser["Username"]; 
bool enrolled = enrolledUsers.Exists(x => 
    string.Equals(x.Name, userName, StringComparison.CurrentCultureIgnoreCase)); 

Czy istnieje powód, dla którego używasz FindIndex zamiast?

Powiązane problemy