2009-07-02 12 views
7

¿Alguien puede ayudar .. Tengo una lista genérica como talOrdenar una lista <> con mi pedido personalizado que está almacenado en otra lista (C#)?

IList<itemTp> itemTps; 

itemTp básicamente es una clase (tiene un número de unidades) y una propiedad en este se "código"

necesito estar capaz de ordenarlo un orden específico que he establecido en otra lista.

Esta lista es una lista simple que enumera el orden (a partir del primero al último) como dicen

Code1 code3 Código2 code5 (nótese que va de 1 a 3 a 2 a 5 - estos son los nombres, se les puede llamar cualquier cosa ... lo importante es el orden, no tiene nada que ver con los números)

Básicamente necesito asegurar los elementos en itemTp ordenar según lo que está presente en la otra lista ...

Entonces imaginar mi iList es así Code1, Código2, code3, code5 - por lo que una vez que la ordenación se realiza en mi

 IList<itemTp> 

contendrá 4 clases que están en orden y que tienen la propiedad como Code1, code3, Código2, code5 (cambio de orden)

¿Alguna idea de cómo hacer esto?

Respuesta

9

Tendrá que crear un IComparer que compare los elementos según el estado de su otra lista. La ventaja de utilizar un IComparer es que podrá crear lógica de almacenamiento en caché en su clase para evitar búsquedas repetidas de IndexOf() si necesita esa optimización. Además, podrá mantener varias "otras" listas que se pueden usar cuando corresponda.

class ItemTpComparer : IComparer<itemTp> 
{ 
    private IList<codeTp> otherList; 

    public ItemTpComparer(IList<codeTp> otherList) 
    { 
     this.otherList = otherList; 
    } 

    public int Compare(itemTp a, itemTp b) 
    { 
     return otherList.IndexOf(a.Code) - otherList.IndexOf(b.Code); 
    } 
} 

Y para llevar a cabo el tipo:

myList.Sort(new ItemTpComparer(otherList)); 
+0

No diría que hay una ventaja. Puede pasar el delegado a un método de instancia de la misma manera que pasa la interfaz, y tiene la lógica que desee allí. – Groo

+0

esto se ve muy bien, solo una pregunta, estás pasando ayb en IndexOf en otraLista ... entonces, ¿qué pasaría si tuviera "TestMeNow" y "TestMeLater" .. Indexof va a devolver 6 para cada uno no ?? –

+0

No entiendo tu comentario. Si TestMeNow y TestMeLater están en otra lista, no pueden estar en el índice 6. – anthony

0

Lo siento si algo está mal, no tengo instalado aquí un editor de C#, pero es algo como esto:

Array.Sort(
    itemTps, 
    delegate(ItemTp a, ItemTp b) 
    { 
      return secondList.IndexOf(a.Code) - secondList.IndexOf(b.Code); 
    }); 

Nota: puede que no sea la forma más eficiente, y además no hay verificando si la segunda lista contiene el Código en absoluto.

[Editar] Como dijo Mehrdad, Array.Sort no funciona por medicamentos genéricos IList<T>. Para ordenar la matriz en su lugar, deberá usar el método ArrayList.Adapter para crear un contenedor y luego ordenarlo. Como ArrayList.Sort no admite una comparación de delegados, debe colocar el delegado anónimo dentro de una implementación de IComparer<T>,.

Si necesita ordenarlo en una lista separada, entonces podría tener sentido utilizar la lógica anterior creando primero una matriz.

+0

Formación.Sort no funcionará en IList genérico

+0

Sí ... Solo estaba pensando en el comparador. Aquí está: http://stackoverflow.com/questions/15486/sorting-an-ilist-in-c – Groo

0

Utilizando C# 3 y LINQ a objetos, me acaba de crear una nueva lista en lugar de tratar de resolver el existente:

void Example() 
{ 
    IList<string> codes; 
    IList<ItemTp> itemTps; 
    itemTps = codes.Select(code => itemTps.Single(itp => itp.Code == code)).ToList(); 
} 
Cuestiones relacionadas