2010-08-12 11 views
27

Tengo dos objetos de lista genéricos, en los que uno contiene identificadores y pedidos, y el otro un montón de identificadores con cada identificación en la segunda lista que tiene una referencia de id para la primera lista, por ejemplo;Clasificación de lista basada en otra lista

public class OptionType 
{ 
    public int ID { get; set; } 
    public int Ordering { get; set; } 
} 

public class Option 
{ 
    public int ID { get; set; } 
    public int Type_ID { get; set; } 
} 

Obviamente me puede hacer una especie simple en una lista de OptionTypes haciendo

types_list.OrderBy(x => x.Ordering); 

pregunta es, sin embargo, ¿cómo iba a ir sobre el pedido de una 'options_list' utilizando el 'TYPE_ID' en el objeto que se relacionaría con el orden de los types_list. Al igual que en algo así como (obviamente esto no es válido - pero esperemos que obtendrá la idea!)

options_list.OrderBy(x => x.Type_ID == types_list.OrderBy(e => e.Ordering)); 
+3

No entiendo, ¿puede darnos una muestra de lo que la salida ordenada podría ser similar dado alguna entrada? –

Respuesta

34

usted debería ser capaz de utilizar una combinación para producir los resultados deseados. Ejemplo utilizando sintaxis de consulta.

var orderedOptions = from option in options_list 
        join type in types_list 
        on option.Type_ID equals type.ID 
        orderby type.Ordering 
        select option; 
+3

Golpe en el dinero, perfecto. Muchas gracias Anthony –

9

Me gusta la sintaxis Lambda, así que se me ocurrió este equivalente. Puedo ver cómo la sintaxis de la consulta es más clara para las uniones.

var orderedOptions = options_list 
    .Join(
     types_list, 
     option => option.Type_ID, 
     type => type.ID, 
     (option, type) => new { Option = option, Type = type }) 
    .OrderBy(x => x.Type.Ordering) 
    .Select(x => x.Option); 



Para una ligera reducción (de lo que, no estoy seguro), esto crea el nuevo objeto con sólo la propiedad de ordenación, en lugar de toda la clase de tipo. No es muy diferente aquí, pero tuve una gran clase con los datos de clasificación, y solo necesito la propiedad de clasificación. No sé si importaba, pero era más claro de leer.

var orderedOptions = options_list 
    .Join(
     types_list, 
     option => option.Type_ID, 
     type => type.ID, 
     (option, type) => new { Option = option, Ordering = type.Ordering }) 
    .OrderBy(x => x.Ordering) 
    .Select(x => x.Option); 

Parece que la sintaxis de la consulta le permite ordenar dentro de la consulta inicial, mientras lambda requiere pedidos después de la unión crea el nuevo objeto. Sin embargo, tal vez estén haciendo lo mismo bajo las sábanas: creando el objeto unido, para ser ordenado y luego seleccionado.

14

List.FindIndex() es su amigo:

var orderedB = listB.OrderBy(b => listA.FindIndex(a => a.id == b.id)); 

Ejemplo de trabajo: https://dotnetfiddle.net/CpLeFU

+2

Esto es realmente agradable – KDecker

+2

Esto es mucho más simple que las uniones. Esto supone que listA ya está ordenada en el orden deseado (type.Ordering). Es decir, está usando la posición de listA en la lista, no una propiedad de listA. También está haciendo FindIndex múltiple, por lo que puede tener un problema de rendimiento en listas grandes. – goodeye

+2

Trazador de líneas muy simple, el rendimiento parece "lo suficientemente bueno" para listas pequeñas. – MaxJ

Cuestiones relacionadas