How to do sort with LINQ with one LISTT inside another?

3

Apparently easy but I'm not able to do a LINQ that orders two LISTs that are nested. I do not know if the word "nested" is correct.

How can I do this sorting through LINQ, in the code below I show where I want to do LINQ.

Current Result

/*
 * Grupo um
 *    Item1
 *    Item3
 *    Item2
 * Grupo dois
 *    Item6
 *    Item4
 *    Item5               
 */

Intended Result:

/*
 * Grupo dois
 *    Item4
 *    Item5
 *    Item6
 * Grupo um
 *    Item1
 *    Item2
 *    Item3               
 */

Following the complete code:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Combo combo = CarregarCombo();

            //Tentei essas linhas abaixo mas estão com erro:
            // Desejo fazer o LINQ no lugar dessas linhas para que eu possa fazer o foreach na LIST ordenada:

            Combo cboTeste1 = new Combo(); 
            Combo cboTeste2 = new Combo();

            cboTeste1.Grupos = combo.Grupos.OrderByDescending(g => g.Key && g.Itens.OrderBy(i => i.Value));
            cboTeste2.Grupos = combo.Grupos.OrderByDescending(g => g.Key).ToList().ForEach(g => g.Itens.OrderBy(i => i.Value)));

            foreach (var grupo in combo.Grupos) //Trocar aqui para usar cboTeste1.Grupos ou cboTeste2.Grupos
            {
                Console.WriteLine(grupo.Text);

                foreach (var item in grupo.Itens)
                {
                    Console.WriteLine(" " + item.Text);
                }
            }

            Console.ReadKey();
        }

        private static Combo CarregarCombo()
        {
            Grupo grupo1 = new Grupo();
            grupo1.Text = "Grupo um";
            grupo1.Key = "1";
            grupo1.Itens = new List<Item>();

            Item item1 = new Item();
            item1.Text = "Item1";
            item1.Value = "1";
            grupo1.Itens.Add(item1);

            Item item3 = new Item();
            item3.Text = "Item3";
            item3.Value = "3";
            grupo1.Itens.Add(item3);

            Item item2 = new Item();
            item2.Text = "Item2";
            item2.Value = "2";
            grupo1.Itens.Add(item2);

            Grupo grupo2 = new Grupo();
            grupo2.Text = "Grupo dois";
            grupo1.Key = "2";
            grupo2.Itens = new List<Item>();

            Item item6 = new Item();
            item6.Text = "Item6";
            item6.Value = "6";  
            grupo2.Itens.Add(item6);

            Item item4 = new Item();
            item4.Text = "Item4";
            item4.Value = "4";
            grupo2.Itens.Add(item4);

            Item item5 = new Item();
            item5.Text = "Item5";
            item5.Value = "5";
            grupo2.Itens.Add(item5);

            Combo combo = new Combo();
            combo.Grupos = new List<Grupo>();
            combo.Grupos.Add(grupo1);
            combo.Grupos.Add(grupo2);

            return combo;
        }
    }

    public class Combo
    {
        public List<Grupo> Grupos { get; set; }
    }

    public class Grupo
    {
        public string Text { get; set; }
        public string Key { get; set; }
        public List<Item> Itens { get; set; }
    }

    public class Item
    {
        public string Text { get; set; }
        public string Value { get; set; }
        public bool Selected { get; set; }
    }
}
    
asked by anonymous 25.11.2016 / 16:55

2 answers

3

Example:

static void Main(string[] args)
{
    Combo combo = CarregarCombo();

    //ordenando os grupos.        
    combo.Grupos = combo.Grupos.OrderBy(o => o.Key).ToList();

    //ordenando e atribuindo a mesma variavel Itens
    combo.Grupos.ForEach(c =>
    {
        c.Itens = c.Itens.OrderBy(d => d.Value).ToList();
    });  

    foreach (var grupo in combo.Grupos)
    {
        Console.WriteLine(grupo.Text);

        foreach (var item in grupo.Itens.OrderBy(c => c.Value))
        {
            Console.WriteLine(" " + item.Text);
        }
    }

    Console.ReadKey();
}

Note: These two sorts may require an adjustment in the Value field, which instead of being a int , is as string . Another point, if you need multiple sort types from the same list, you just assign the new values to new variables.

    
25.11.2016 / 17:14
3

I did not understand your question very well, but is not it enough to order the return?

 public static void Main(string[] args)
    {
        Combo combo = CarregarCombo();

        foreach (var grupo in combo.Grupos.OrderBy(g => g.Key))
        {
            Console.WriteLine(grupo.Text);

            foreach (var item in grupo.Itens.OrderBy(c => c.Value))
            {
                Console.WriteLine(" " + item.Text);
            }
        }

        Console.ReadKey();
    }

See a functional example in Ideone.

    
25.11.2016 / 18:45