Como posso classificar a lista genérica DESC e ASC?

110

Como posso classificar a lista genérica DESC e ASC? Com LINQ e sem LINQ? Estou usando o VS2008.

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}
Penguen
fonte

Respostas:

246

Com Linq

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

Sem Linq

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

Observe que, sem o Linq, a própria lista está sendo classificada. Com o Linq, você obtém um enumerável ordenado da lista, mas a lista em si não mudou. Se você quiser alterar a lista, altere os métodos Linq para algo como

li = li.OrderBy(i => i).ToList();
Anthony Pegram
fonte
1
@onedaywhen Se achar que a resposta de outro usuário está incorreta, você deve comentar, votar e / ou fornecer uma resposta que considere correta, e não editar a resposta de outra pessoa para ser o que você acha que está correto.
Servy
24
Acho que para ordem decrescente é muito mais claro de usar do li.Sort((a, b) => b.CompareTo(a));que a -1*abordagem usada aqui. Editei a resposta de acordo, mas @Servy a reverteu.
dia em
9
@onedaywhen Quando o autor cometeu um erro ao escrever o que pretendia, não há problema em alterá-lo para o que pretendia. Alterar a forma de código que outra pessoa pensou que deveria ser a solução para usar uma abordagem diferente que você acha que deveria ser usada em vez disso não é uma edição apropriada.
Servy
5
@onedaywhen Certo; você o verá em qualquer lugar que veja a descrição da edição. Na central de ajuda, "Quando devo editar as postagens? [...] Para esclarecer o significado da postagem (sem alterar esse significado)"
Servy
4
Ou apenas -a.CompareTo(b).
Shimmy Weitzhandler
72

Sem Linq:

Ascendente:

li.Sort();

Descendente:

li.Sort();
li.Reverse();
Sani Singh Huttunen
fonte
Sort()é um método vazio, então você não pode encadear o Reverse()a ele dessa maneira. Você precisará de 2 operações separadas. No entanto, com o LINQ, você pode encadear a um, OrderBymas nesse ponto você deve apenas usar OrderByDescending.
Ahmad Mageed
20

sem linq, use Sort()e então Reverse().

Srinivas Reddy Thatiparthy
fonte
3

Eu estava verificando todas as respostas acima e gostaria de acrescentar mais uma informação adicional. Eu queria classificar a lista na ordem DESC e estava procurando a solução que é mais rápida para entradas maiores e estava usando este método anteriormente: -

li.Sort();
li.Reverse();

mas meus casos de teste estavam falhando por exceder os limites de tempo, então a solução abaixo funcionou para mim: -

li.Sort((a, b) => b.CompareTo(a));

Portanto, em última análise, a conclusão é que a segunda forma de classificação de lista em ordem decrescente é um pouco mais rápida do que a anterior.

Sarawgeek
fonte
-3

Maneira muito simples de classificar a lista com valores int em ordem decrescente:

li.Sort((a,b)=> b-a);

Espero que isso ajude!

Sunil Murali
fonte
4
Isso não é o que int.CompareTo(int)significa uma razão. Consulte a fonte em reference.microsoft.com que diz: "É necessário usar comparar porque a subtração mudará para positivo para números neg muito grandes, etc. ". Se você tiver b = int.MinValuee a = 1(digamos), isso irá falhar. Às vezes, uma chamada de método vale a pena.
Wai Ha Lee
A pergunta diz sobre a classificação de listas genéricas. A operação "-" nem mesmo compilava para muitos tipos. E para o conjunto de tipos compilado, você pode ter um erro de estouro numérico, conforme mencionado no comentário anterior
Vadim Levkovsky