Sort List by Field String

1

I have a list with attributes, of which I have the field of evaluations, containing: Excellent, Good, Regular, Bad, and Poor. The information for this field I get from consuming a REST API using JSON.

Example:

IEnumerable<minhaEntidade> minhaLista = _respositorio.ConsumirAPI();

foreach (var item in minhaLista)
{
    Retorno.Add(new minhaNovaEntidade()
    {
            Nome = item.NomeCompleto,
            Endereco = item.EnderecoCompleto,
            Avaliacao = item.AvaliacaoDesempenho
    });
}

If I do:

return Retorno.OrderBy(x => x.Avaliacao);

I'll have the list sorted by performance ratings in alphabetical order.

However, I need to sort the list by following the precedence criteria: Excellent, Good, Fair, Bad, and Poor.

That is, all Names and Addresses that have first been evaluated as Excellent, then Good, then Regular, then Bad, then Poor. In this order.

I've tried to create a Type-Safe Enum Pattern

to compare the list obtained with my Type-Safe Enumerator , example:

return Retorno.OrderBy(x => MeuEnumerador().CompareTo(x.Avaliacao));

or ...

return Retorno.Sort((x,y) => x.Avaliacao.CompareTo(MeuEnumerador().ToString()))

But it did not work and / or gives error.

Questions:

Has anyone ever had to do something similar to this my problem using C #?

Or, do you have any implementation suggestions for what I'm looking for?

Remembering that the information does not come from a database (which would be easy to solve), but a JSON API, and the field is just a string.

    
asked by anonymous 04.06.2018 / 22:49

2 answers

1

Create a enum for the ratings and sort by it:

public enum Avaliacoes
{
    Excelente = 0,
    Bom = 1,
    Regular = 2,
    Ruim = 3,
    Pessimo = 4
}

I made a sample code:

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Lista Original:");

        List<Entidade> entidades = new List<Entidade>();
        entidades.Add(new Entidade(){ Id =1, Nome = "Teste 1", Avaliacao = Avaliacoes.Ruim });
        entidades.Add(new Entidade(){ Id =2, Nome = "Teste 2", Avaliacao = Avaliacoes.Pessimo });
        entidades.Add(new Entidade(){ Id =3, Nome = "Teste 3", Avaliacao = Avaliacoes.Regular });
        entidades.Add(new Entidade(){ Id =4, Nome = "Teste 4", Avaliacao = Avaliacoes.Bom });
        entidades.Add(new Entidade(){ Id =5, Nome = "Teste 5", Avaliacao = Avaliacoes.Ruim });
        entidades.Add(new Entidade(){ Id =6, Nome = "Teste 6", Avaliacao = Avaliacoes.Regular });
        entidades.Add(new Entidade(){ Id =7, Nome = "Teste 7", Avaliacao = Avaliacoes.Ruim });
        entidades.Add(new Entidade(){ Id =8, Nome = "Teste 8", Avaliacao = Avaliacoes.Bom });
        entidades.Add(new Entidade(){ Id =9, Nome = "Teste 9", Avaliacao = Avaliacoes.Ruim });
        entidades.Add(new Entidade(){ Id =10, Nome = "Teste 10", Avaliacao = Avaliacoes.Ruim });
        entidades.Add(new Entidade(){ Id =11, Nome = "Teste 11", Avaliacao = Avaliacoes.Bom });
        entidades.Add(new Entidade(){ Id =12, Nome = "Teste 12", Avaliacao = Avaliacoes.Excelente });
        entidades.Add(new Entidade(){ Id =13, Nome = "Teste 13", Avaliacao = Avaliacoes.Excelente });


        entidades.ForEach(x => Console.WriteLine(x.Nome + " / " + x.Avaliacao));

        entidades =  entidades.OrderBy(x => x.Avaliacao).ToList();


        Console.WriteLine("----------------------------------------------");
        Console.WriteLine("Lista Ordenada:");

        entidades.ForEach(x => Console.WriteLine(x.Nome + " / " + x.Avaliacao));


    }


    public class Entidade
    {
        public int Id {get;set;}
        public string Nome {get;set;}
        public Avaliacoes Avaliacao {get;set;}

    }

    public enum Avaliacoes
    {
        Excelente = 0,
        Bom = 1,
        Regular = 2,
        Ruim = 3,
        Pessimo = 4
    }
}
  

Result:

Lista Original:
Teste 1 / Ruim
Teste 2 / Pessimo
Teste 3 / Regular
Teste 4 / Bom
Teste 5 / Ruim
Teste 6 / Regular
Teste 7 / Ruim
Teste 8 / Bom
Teste 9 / Ruim
Teste 10 / Ruim
Teste 11 / Bom
Teste 12 / Excelente
Teste 13 / Excelente
----------------------------------------------
Lista Ordenada:
Teste 12 / Excelente
Teste 13 / Excelente
Teste 4 / Bom
Teste 8 / Bom
Teste 11 / Bom
Teste 3 / Regular
Teste 6 / Regular
Teste 1 / Ruim
Teste 5 / Ruim
Teste 7 / Ruim
Teste 9 / Ruim
Teste 10 / Ruim
Teste 2 / Pessimo

I put it in the DotNetFiddle

ps. You will need to convert the String that comes in json pro enum, then: link

    
04.06.2018 / 23:35
1

Suggestion to solve the problem. Create a weight field / attribute on your minhaNovaEntidade . When adding the new item to the return list, enter the value of the weight. After you've included all the ranked items, reorder the list based on weight. Example:

foreach (var item in minhaLista)
{
   xxx = new minhaNovaEntidade()
   {
        Nome = item.NomeCompleto,
        Endereco = item.EnderecoCompleto,
        Avaliacao = item.AvaliacaoDesempenho
   };

switch (item.AvaliacaoDesempenho)
        {
            case "Excelente":
                xxx.peso = 1;
                break;

            case "Bom";
                xxx.peso = 2;
                break;

            default:
                xxx.peso = 99;
                break;
        }

Retorno.Add(xxx);

}

return Retorno.OrderBy(x => x.peso);
    
04.06.2018 / 23:28