En parte de mi aplicación, tengo una opción que muestra una lista de álbumes del artista actual que no están en la biblioteca de música. Para obtener esto, llamo a una API de música para obtener la lista de todos los álbumes de ese artista y luego elimino los álbumes que están en la biblioteca actual.
Para hacer frente a las diferentes mayúsculas y minúsculas de los nombres y la posibilidad de faltar (o puntuación adicional) en el título, he escrito un IEqualityComparer para usar en la llamada .Except :
var missingAlbums = allAbumns.Except(ownedAlbums, new NameComparer()); Este es el método Equals :
public bool Equals(string x, string y) { // Check whether the compared objects reference the same data. if (ReferenceEquals(x, y)) return true; // Check whether any of the compared objects is null. if (x is null || y is null) return false; return string.Compare(x, y, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreSymbols) == 0; } Este es el método GetHashCode :
public int GetHashCode(string obj) { // Check whether the object is null if (obj is null) return 0; // Make lower case. How do I strip symbols? return obj.ToLower().GetHashCode(); }Esto falla, por supuesto, cuando la cadena contiene símbolos, ya que no los elimino antes de obtener el código hash, por lo que las dos cadenas (por ejemplo, "Baa, baa, oveja negra" y "Baa baa oveja negra") todavía no son iguales incluso después de convertir a minúsculas.
He escrito un método que eliminará los símbolos, pero eso significaba que tenía que adivinar cuáles son realmente esos símbolos. Funciona para los casos que he probado hasta ahora, pero espero que falle eventualmente. Me gustaría un método más confiable para eliminar los símbolos.
Dado que CompareOptions.IgnoreSymbols existe, ¿hay algún método al que pueda llamar que elimine estos caracteres de una cadena? ¿O en su defecto, un método que devuelva todos los símbolos?
Encontré el método IsPunctuation para los caracteres, pero no puedo determinar si lo que se considera puntuación es lo mismo que lo que la opción de comparación de cadenas considera un símbolo.
Si va a usar la enumeración CompareOptions , creo que también podría usarla con la clase CompareInfo para la que está documentado como diseñado:
Define las opciones de comparación de cadenas para usar con CompareInfo .
Luego puede usar el método GetHashCode(string, CompareOptions) de esa clase (e incluso el método Compare(string, string, CompareOptions) si lo desea).