es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ordenar una búsqueda por una lista dada.

¿Cómo puedo ordenar las claves de un ILookup como los valores de una lista dada en C#?
Encontré estos dos enlaces, pero no entiendo cómo hacerlo.
https://stackoverflow.com/questions/7942207/how-to-sort-a-lookup
https://stackoverflow.com/questions/15275269/sort-a-list-from-another-list-ids

static void Main()
{
    // lista con IDs de categorías (el orden está dado por la lógica interna)
    List<long> sortedList = new List<long> { 533, 321, 752, 251, 985 };

    // crear el ILookup con CategoryId como clave para los productos
    // el ILookup ya existe en el código original y es necesario antes y después de la reordenación
    List<product> products = new List<product>();
    products.Add(new Product { Id = 23, CategoryId = 752 });
    products.Add(new Product { Id = 24, CategoryId = 752 });
    products.Add(new Product { Id = 25, CategoryId = 533 });
    products.Add(new Product { Id = 26, CategoryId = 321 });
    products.Add(new Product { Id = 27, CategoryId = 321 });

    ILookup<long, product=""> lookupUnsorted = products.ToLookup(prod => prod.CategoryId, prod => prod);

    // ¿cómo puedo ordenar el ILookup para que las claves estén ordenadas como en sortedList?

    // intenté algo como esto (lo cual da un error de conversión)
    ILookup<long, product=""> lookupSortedBySortedList = lookupUnsorted
        .OrderBy(p => sortedList.IndexOf(p.Key)).ToLookup(prod => prod.Key, prod => prod);

    // también pensé en iterar sobre sortedList
    // y agregar los elementos de lookupUnsorted a un nuevo Lookup, pero no es posible agregar elementos a un lookup
    // ¿o con LINQ o con la ayuda de Join?

}

class Product
{
    public long Id { get; set; }
    public long CategoryId { get; set; }
}

Gracias.</long,></long,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para ordenar las claves de un ILookup como los valores de una lista dada en C#, puedes usar LINQ para ordenar el ILookup basándote en el índice de las claves en la lista dada. Aquí tienes un ejemplo de código que demuestra cómo hacer esto:

    // lista con los IDs de categoría (el orden está dado por lógica interna)
    List<long> sortedList = new List<long> { 533, 321, 752, 251, 985 };
    
    // crea el ILookup con el CategoryId como clave para los productos
    List<product> products = new List<product>();
    products.Add(new Product { Id = 23, CategoryId = 752 });
    products.Add(new Product { Id = 24, CategoryId = 752 });
    products.Add(new Product { Id = 25, CategoryId = 533 });
    products.Add(new Product { Id = 26, CategoryId = 321 });
    products.Add(new Product { Id = 27, CategoryId = 321 });
    
    ILookup<long, product=""> lookupUnsorted = products.ToLookup(prod => prod.CategoryId, prod => prod);
    
    // ordena el ILookup basándote en la sortedList
    ILookup<long, product=""> lookupSorted = sortedList
        .Select(key => new { key, values = lookupUnsorted[key] })
        .ToLookup(x => x.key, x => x.values.First());
    
    // itera sobre el ILookup ordenado
    foreach(var group in lookupSorted)
    {
        Console.WriteLine("Key: " + group.Key);
        foreach(var value in group)
        {
            Console.WriteLine("Value: " + value.Id);
        }
    }
    

    En este código, primero creamos un ILookup no ordenado usando el método ToLookup. Luego, usamos LINQ para ordenar el ILookup basándonos en la sortedList. Proyectamos cada clave en la lista a un nuevo objeto que contiene la clave y los valores correspondientes del ILookup no ordenado. Luego, convertimos los objetos proyectados en un nuevo objeto ILookup usando ToLookup.

    Ten en cuenta que en este código, asumimos que cada clave en la sortedList existe en el ILookup no ordenado. Si este no es el caso, necesitarás agregar un manejo de errores para manejar las claves faltantes.</long,></long,>

Comments are closed.