2009-03-24 47 views
14

Tengo una propiedad que devuelve HashTable. Me gustaría ordenarlo sin refacturar mi propiedad. Tenga en cuenta: No deseo devolver otro tipo. Código:¿Es posible ordenar una tabla Hash?

/// <summary> 
    /// All content containers. 
    /// </summary> 
    public Hashtable Containers 
    { 
     get 
     { 
      Hashtable tbl = new Hashtable(); 
      foreach (Control ctrl in Form.Controls) 
      { 
       if (ctrl is PlaceHolder) 
       { 
        tbl.Add(ctrl.ID, ctrl); 
       } 
       // Also check for user controls with content placeholders. 
       else if (ctrl is UserControl) 
       { 
        foreach (Control ctrl2 in ctrl.Controls) 
        { 
         if (ctrl2 is PlaceHolder) 
         { 
          tbl.Add(ctrl2.ID, ctrl2); 
         } 
        } 
       } 
      } 

      return tbl; 
     } 
    } 
+0

+1 ¡Debido a downvote! ¡Es una pregunta perfectamente válida de alguien que no entiende lo que es una HashTable! –

+0

+1 debido a downvote. La pregunta muestra que el póster no sabe cómo funcionan las HashTables, pero es un tema perfectamente válido. – snemarch

+1

@agassan: Limpié tu publicación un poco para que fuera más cohesiva y eliminé la pregunta de LINQ ya que no parecía ser lo que realmente estabas preguntando. Siéntete libre de retroceder si no te gusta esto. –

Respuesta

8

Otra opción es construir la tabla hash como ya lo hace, y luego simplemente construir un conjunto ordenado de las teclas. Puede iterar a través de ese conjunto de claves ordenadas, obteniendo el valor correspondiente de la tabla hash según sea necesario.

+0

. Así fue exactamente como pude hacerlo funcionar. – user81740

3

Lo sentimos, pero no se puede ordenar tabla hash. Deberá refactorizar su código para usar algunas colecciones ordenables.

6

lubos tiene razón: que no puede Ordenar una tabla hash. Si pudieras, no sería una HashTable. Puede enumerar HashTable y luego ordenar la enumeración. Pero eso sería muy lento. Es mucho mejor usar un SortedDictionary en su lugar.

0

No tiene sentido ordenar una tabla hash porque ya tiene un tiempo de búsqueda casi constante. O en el peor O (B) donde B es el tamaño del cubo.

18

Hashtables funcionan mapeando claves a valores. Implícito en este mapeo está el concepto de que las claves no están clasificadas o almacenadas en ningún orden particular.

Sin embargo, puedes echar un vistazo a SortedDictionary<K,V>.

+0

Gracias. Funciona genial. Era muy fácil para la propiedad del reactor ya que la mayoría de mis elementos desplegables usaban Key Pair Value – user81740

1

Deberá devolver algo que no sea una tabla hash. No voy a reiterar lo que dice que ya entiende, pero necesita reconsiderar cualquier parte de su diseño que requiera que devuelva los objetos clasificados en una tabla hash.

0

Por supuesto, las tablas hash se pueden ordenar, pero primero debe definir lo que significa ordenar una tabla hash. (Ahí radica el problema)

Una vez que haya hecho eso, sin embargo, invariablemente ha eliminado todas las ventajas que una tabla hash puede darle, y también podría usar una matriz ordenada (con búsqueda binaria), o usar un árbol rojo-negro en su lugar.

1

No es exactamente una respuesta C#, pero estoy seguro de que puede hacer algo al respecto.

En Perl, es común "ordenar" una tabla hash para utilizar en la salida de la pantalla.

Por ejemplo:

print "Items: "; 
foreach (sort keys %items) { 
    print $_, '=', $items{$_}, ' '; 
} 

El truco aquí es que Perl no ordena el hash, que es clasificar una lista copiado de claves hash. Debería ser bastante fácil en C# extraer las claves hash en una lista y luego ordenarlas.

+0

He hecho eso, creando el objeto SortList, luego repito los valores hashtable y los valores colocados en SortList y luego sortList.Sort() – user81740

0

Soy un nuevo programador así que tome todo lo que digo con un grano de sal. Pero esto es lo que hice cuando me encontré con una situación similar. Creé una clase que tenía dos variables y luego creé un objeto List de esas variables y luego usé linq para ordenar esas variables.

Cuestiones relacionadas