2010-06-25 10 views
151

¿Cómo puedo hacer que la línea de abajo no distinga entre mayúsculas y minúsculas?¿Cómo puedo hacer una comparación de cadenas insensible a mayúsculas y minúsculas?

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

me dieron algunos consejos día de hoy que sugirió que utilizo:

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

el problema es que no puedo conseguir que esto funcione, lo he intentado por debajo de la línea, esto compila pero vuelve los resultados incorrectos, devuelve a los usuarios inscritos como usuarios no inscritos y no inscritos según se inscribieron.

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

¿Alguien puede señalar el problema?

+1

¿Qué tipo de datos debe 'drUser [" Enrolled "]' be? Parece un valor booleano, pero 'FindIndex()' devuelve el índice. Si el índice de ese usuario es 0, devolverá 0, que puede ser falso. Cuando, en realidad, es verdad. El método 'Exists()' puede ser mejor en este caso. – drharris

+0

¿Estás seguro de que no hay un momento de formateo o un espacio adicional en un campo que no está en el otro? – joshlrogers

+1

Sugeriría inscrito inscritos.Any() en lugar de FindIndex (y prueba). – Marc

Respuesta

1

¿Qué le parece usar StringComparison.CurrentCultureIgnoreCase en su lugar?

+4

-1: Esta respuesta es insuficiente. Consulte la respuesta de @ ocean4dream: http://stackoverflow.com/a/13965429/109941. –

+0

@decyclone: ​​es más lento que OrdinalIgnoreCase, pero puede ser relevante en algunos casos. Por lo tanto, no daré -1. https://stackoverflow.com/questions/2749662/string-comparison-invariantcultureignorecase-vs-ordinalignorecase –

+0

También https://stackoverflow.com/questions/72696/which-is-generally-best-to-use-stringcomparison-ordinalignorecase -o-stringco –

32

usted debe utilizar la función estática String.Compare como seguir

x => String.Compare (x.Username, (string)drUser["Username"], 
        StringComparison.OrdinalIgnoreCase) == 0 
+2

No, debería usar 'String.Equals' en lugar de' String.Compare'. No es necesario calcular cuál es mayor, solo que no son iguales. – ErikE

+0

@ErikE: Me pregunto, qué método recomendarás usar en 6 años más :-) – Oleg

+0

¡No me pregunto! Confío en que recomendaré usar la igualdad cuando desee la semántica de igualdad y el uso de la comparación cuando desee una semántica de comparación. ¿Qué es tan difícil acerca de eso? 'IEquatable' y' IComparable' NO hacen lo mismo, y puede tener clases que implementen una pero en las que NO tendría sentido implementar la otra. Por ejemplo, puede ordenar muestreos de sensores por tiempo sin que ninguno de ellos sea igual (IComparable). Y, puede indicar si las cosas son iguales (IEquatable) pero no tiene sentido pedirlas (por ejemplo, números de serie de la computadora). – ErikE

297

Ésta no es la mejor práctica en el marco .NET (4 & +) para comprobar la igualdad

String.Compare(x.Username, (string)drUser["Username"], 
        StringComparison.OrdinalIgnoreCase) == 0 

Usar la siguiente vez

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

MSDN recommends:

  • Utilice una sobrecarga del método String.Equals para probar si dos cadenas son iguales.
  • Utilice la String.Compare y String.CompareTo métodos para ordenar cadenas, no para comprobar la igualdad.
+5

Debe usar 'string.Compare', no' String.Compare'. – Fred

+2

@Fred Estoy de acuerdo, pero ¿puede usted calificar la razón? – Gusdor

+0

@Gusdor, consulte http://stackoverflow.com/questions/32187486/why-is-string-considered-a-simplified-version-of-string y https://stackoverflow.com/questions/7074/in-c- sharp-whats-the-difference-between-string-and-string – Fred

-9

siempre se puede usar funciones: .ToLower(); .ToUpper();

convertir sus cadenas y luego compararlas ...

buena suerte

+0

No creo que esto solucione su problema. También marque que esta pregunta ya tiene más de 4 años. –

+4

Esto crea una nueva cadena, por lo que considero esto muy ineficiente. Porque para crear esta nueva cadena, todos los caracteres se verificarán y se convertirán al caso deseado, luego la comparación tiene que verificar todos los caracteres nuevamente. Por lo tanto, usa más memoria y potencia de procesamiento. – Air2

+2

Esta es una práctica muy mala debido a la asignación de memoria. –

13

Utilice este para la comparación:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase); 
+2

Solo tenga en cuenta las ventajas y los inconvenientes de utilizar CurrentCultureIgnoreCase vs. OrdinalIgnoreCase. Si no necesita la semántica de la comparación cultural, guarde algunos resultados y use la comparación ordinal. – ErikE

2

Creo que usted encontrará más información en este enlace:

http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/

Usar th e Compare el método estático en la clase String para comparar las dos cadenas. Si la comparación no distingue entre mayúsculas y minúsculas está determinada por el tercer parámetro de una de sus sobrecargas. Por ejemplo:

string lowerCase = "abc"; 
string upperCase = "AbC"; 
int caseInsensitiveResult = string.Compare(lowerCase, upperCase, 
    StringComparison.CurrentCultureIgnoreCase); 
int caseSensitiveResult = string.Compare(lowerCase, 
    StringComparison.CurrentCulture); 

El valor caseSensitiveResult es -1 (que indica que minúsculas es "menor que" mayúscula) y la caseInsensitiveResult es cero (lo que indica que minúscula "es igual a" mayúscula).

2

Usted puede (aunque controverse) se extienden System.String para proporcionar una comparación insensible caso: public static bool CIEquals(this String a, String b) { return a.Equals(b, StringComparison.CurrentCultureIgnoreCase); } y utilizar como tal:

x.Username.CIEquals((string)drUser["Username"]);

C# le permite crear decenas de miles métodos de extensión que puede servir como sugerencias de sintaxis en su proyecto, bastante útil, diría yo.

No es la respuesta y sé que esta pregunta es antigua y está resuelta, solo quería agregar estos bits.

0

Otros respuesta son totalmente válidos aquí, pero de alguna manera lleva algún tiempo escribir StringComparison.OrdinalIgnoreCase y también usar String.Compare.

He codificado sencillo método de extensión de cadena, donde se puede especificar si la comparación es entre mayúsculas y minúsculas o caja sin sentido con booleano, adjuntando toda fragmento de código aquí:

using System; 

/// <summary> 
/// String helpers. 
/// </summary> 
public static class StringExtensions 
{ 
    /// <summary> 
    /// Compares two strings, set ignoreCase to true to ignore case comparison ('A' == 'a') 
    /// </summary> 
    public static bool CompareTo(this string strA, string strB, bool ignoreCase) 
    { 
     return String.Compare(strA, strB, ignoreCase) == 0; 
    } 
} 

Después de toda esa comparación se acorta por aproximadamente 10 caracteres - comparar:

Antes de utilizar la extensión de la secuencia:

String.Compare(testFilename, testToStart,true) != 0 

Después de usar la extensión de la secuencia:

testFilename.CompareTo(testToStart, true) 
Cuestiones relacionadas