2010-06-25 20 views
11

Estoy leyendo un nombre de usuario y luego comprobando si existe otra tabla de base de datos, el problema es que el nombre de usuario es el mismo, el caso puede ser diferente y no permite encontrar un ejemplo jsmith y JSmith o JSMITH.C# Comparando cadenas con casos diferentes

¿Cómo puedo solucionar esto? ¿Debo disminuir el caso al escribir en la primera base de datos o puedo modificar mi código a continuación cuando estoy comparando los dos?

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

ACTUALIZACIÓN:

Todavía luchando con esto, el siguiente código compila pero no da el resultado correcto, cuando se ven los usuarios inscritos veo a aquellos que no están matriculados, durante la visualización de las que no lo son inscrito, veo 1 que está inscripto pero su nombre de usuario es el mismo en cada datababse. ¿He formateado el código a continuación correctamente?

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

Gracias Jamie

+1

Dang, yo era demasiado lento. Pensé que sería apropiado para mí responder a este ...;) – jsmith

+0

@jsmith: ¿Qué? – SLaks

+1

@SLaks su nombre de ejemplo ... es mi nombre de usuario ... :) – jsmith

Respuesta

21

Se necesitan cal del Equals method, que toma un parámetro StringComparison.

Por ejemplo:

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

Si x.Username puede haber null, debe llamar a la static Equals method:

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

De lo contrario, puede lanzar una x.Username.EqualsNullReferenceException.

+0

Disculpa que suene grueso, pero el código siguiente no funciona correctamente, compila pero no encuentra los usuarios coincidentes. drUser ["Inscrito"] = (inscritoUsuarios.Indexivo (x => x.nombredeusuario.Equals ((cadena) drUser ["Nombre de usuario"], StringComparison.OrdinalIgnoreCase))); – Jamie

+0

Acabo de probar la actualización, y esto no se compila. ¿Dónde estoy equivocado? drUser ["Inscrito"] = (inscritoUsers.FindIndex (String.Equals (x.Username, (string) drUser ["Nombre de usuario"], StringComparison.OrdinalIgnoreCase))); – Jamie

+0

Por favor edite su pregunta y agregue su código exacto. – SLaks

3

La mejor forma de hacer esto, es para especificar la comparación de cadenas utilizando algo como

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

para hacer la comprobación de igualdad, en lugar de "=="

+0

Esto no se compilará (se olvidó de lanzar). – SLaks

+0

buen lugar - gracias! –

0

Cómo sobre el uso ToUpper() .

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

proporcione una razón para el voto hacia abajo. Me gustaría saber por qué este código es una mala práctica. Gracias – MikeTWebb

+0

No te he rechazado, pero puedo adivinar por qué. En primer lugar, esto explotará si cualquiera de los valores es nulo. En segundo lugar, esto no es cultura consciente. Puede funcionar para inglés (y muchos otros idiomas también), pero no todos. El ejemplo frecuentemente citado es "The Turkish Case": http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html .Net le ofrece comparaciones de cadenas culturalmente conscientes de forma gratuita - ¡usalos, usalos a ellos! –

+0

Lejos ... gracias por la explicación. Muy apreciado. Sí, en lo que respecta a los NULL ... el ejemplo de código no tenía la intención de ser a prueba de balas. Siempre controlo por NULLs. – MikeTWebb

0

¿Has probado esto?

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

¿Hay algún motivo por el que esté utilizando FindIndex?