Pregunto si esto es posible.

Tenemos una 3ª Parte de la biblioteca que contiene información sobre la identificación de los usuarios…

La principal interacción con la biblioteca a través de una tabla Hash que se introduce con una cadena, y devuelve un Objeto de Gráfico de la información para esa clave.

El problema es que la clave es, obviamente, Sensible a mayúsculas y minúsculas, pero lo que tenemos desde el navegador del usuario no coincide necesariamente con el caso… (a menudo recibimos la llave completamente en minúsculas d)

Me pregunto si es posible hacer un Insensible a mayúsculas-minúsculas clave de búsqueda en una tabla hash.

por ejemplo,

Hashtable ht = new Hashtable();
ht.Add("MyKey", "Details");

string result = ht["MyKey"];
string result = ht["MYKEY"];
string result = ht["mykey"];

En la posibilidad de que podríamos presentar un ticket de soporte a la empresa para agregar esta funcionalidad, hay otros DataStructures (es decir, las nuevas colecciones genéricas/diccionarios) que admiten esta funcionalidad

Por último, sería posible reemplazar el Sistema.Cadena de GetHashCode() método, para
hacer todo caso invariante cadenas de devolver el mismo hashcode… por ejemplo, estoy pensando que esto es un no de los que van como string es una clase cerrada

Saludos si alguien tiene alguna sugerencia

  • como un aparte: si usted está utilizando .NET 3.5 probablemente debería dejar de usar Hashtable etc – y empezar a utilizar las colecciones genéricas en su lugar.
  • Volver a tu comentario: tal vez solo llame .ToLowerInvariant() en todas sus claves, entonces.
  • rasguños en la cabeza Pero las llaves que están dentro de la tabla de Hash no son ToLowered(). I. e. Me dan un pre-construido hashtable que crear instancias/pobladas dentro de una dll. y con las llaves en HT son Sensibles a las mayúsculas… El único acceso que tengo a la dll es a través de un captador/indizador donde paso la clave, por lo que incluso si toLowerInvarianted mis llaves en el exterior, que no coinciden con las llaves en el interior.

4 Comentarios

  1. 31

    Código para hacer que la tabla hash comparaciones entre mayúsculas y minúsculas

    Para 2.0, 3.0, 3.5

    Hashtable ht = new Hashtable(StringComparer.InvariantCultureIgnoreCase);

    Puede obtener información sobre las InvariantCultureIgnoreCase vs OrdinalIgnoreCase en este TAN enlace

    O

    Hashtable ht = System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable();

    Porque no distingue mayúsculas de minúsculas diccionario de la colección es de un uso común, el .NET Framework tiene una clase CollectionUtil que soporta la creación de la tabla Hash y SortedList objetos que son sensibles a mayúsculas y minúsculas. Utilice llamando CreateCaseInsensitiveHashtable o CreateCaseInsensitiveSortedList.

    Para .Net 1.0 (no estoy seguro de si 1.0 es compatible con StringComparer)

    public class InsensitiveComparer : IEqualityComparer
    {
        CaseInsensitiveComparer _comparer = new CaseInsensitiveComparer();
        public int GetHashCode(object obj)
        {
            return obj.ToString().ToLowerInvariant().GetHashCode();
        }
    
        public new bool Equals(object x, object y)
        {
            if (_comparer.Compare(x, y) == 0)
            {
                return true;
            }
    
            else
           {
               return false;
           }
        }
    }
    
    Hashtable dehash = new Hashtable(new InsensitiveComparer());
    • El StringComparer clase proporciona ya no distingue mayúsculas de minúsculas comparers – no hay necesidad de implementar su propio.
    • Gracias Daniel. He editado mi respuesta.
    • Esto es sólo un FYI: me enteré de que StringDictionary teclas son sensibles a mayúsculas y minúsculas de forma predeterminada. Pero tanto la clave y el valor deben ser cadenas.
    • También puede utilizar CreateCaseInsensitiveHashtable. Editado mi respuesta para reflejar el uso.
  2. 17

    Con un diccionario:

    new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

    pero más sencillo, creo StringDictionary es sensible a las mayúsculas también:

        StringDictionary ht = new StringDictionary();
        ht.Add("MyKey", "Details");
    
        string result1 = ht["MyKey"];
        string result2 = ht["MYKEY"];
        string result3 = ht["mykey"];
    • Saludos Marc. Y saludos a los demás para señalar la IEqualityOperator sobrecargas… por Desgracia, no tengo acceso a los componentes internos de la biblioteca o de la construcción de la tabla de Hash… he descubierto la aplicación mediante el uso de un Reflector, para hurgar en su interior. Creo que voy a registrar un ticket de soporte con la empresa y les pregunto si puede ser agregado como una «Característica»
  3. 2

    Usted puede proporcionar una insensible a mayúsculas- IEqualityComparer a la HashTable constructor, pero esto requiere que pueden influir en el HashTable de la construcción en la 3ª parte de la biblioteca.

    Si usted llena la tabla hash de su código, usted podría normalizar las claves en la inserción y recuperar normalizado teclas de nuevo.

    Si usted es incapaz de influir en el contenido de la tabla hash, pero usted sabe que la estructura de las llaves, usted puede corregir la entrada del usuario antes de acceder a la tabla hash.

  4. 1

    Esto no es una manera muy eficiente, pero siempre se puede tomar de la tabla hash y hacer un StringDictionary de ella:

    Hashtable ht = new Hashtable();
    ht.Add("FOO", "bar");
    
    StringDictionary dict = new StringDictionary();
    
    foreach(string key in ht.Keys)
        dict.Add(key, ht[key].ToString());
    
    string result = dict["foo"]; //Assigns "bar" to result
    • +1 Esto es buena idea. (Pero falla en «FOO» y «foo» en la tabla hash.)
    • Así, mediante el indizador en lugar del método Add impediría una excepción, y no cualquier solución tiene el mismo problema, si el original Hashtable tiene varias claves que difieren en el caso de que sólo?

Dejar respuesta

Please enter your comment!
Please enter your name here