Como faço para obter uma lista distinta, ordenada de nomes de um DataTable usando o LINQ?

votos
83

Eu tenho um DataTablecom uma Namecoluna. Eu quero gerar uma coleção dos nomes exclusivos ordenados alfabeticamente. A consulta a seguir ignora a ordem por cláusula.

var names =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr[Name]
    select (string)dr[Name]).Distinct();

Por que a orderbynão ser aplicadas?

Publicado 01/08/2008 em 14:14
fonte usuário
Em outras línguas...                            


7 respostas

votos
51

O problema é que o operador Distinct não concede que ele vai manter a ordem original de valores.

Então sua consulta terá de trabalhar assim

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Respondeu 01/08/2008 em 14:18
fonte usuário

votos
30

Para torná-lo mais legível e de fácil manutenção, você também pode dividi-la em várias instruções LINQ.

  1. Primeiro, selecione os dados para uma nova lista, vamos chamá-lo x1, fazer uma projeção se desejado
  2. Em seguida, crie uma lista distinta, a partir de x1dentro x2, usando qualquer distinção você precisar
  3. Finalmente, criar uma lista ordenada, de x2dentro x3, a classificação por tudo o que desejo
Respondeu 04/09/2008 em 03:57
fonte usuário

votos
8
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Respondeu 05/12/2008 em 02:08
fonte usuário

votos
5

Experimente o seguinte:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Respondeu 28/04/2013 em 10:27
fonte usuário

votos
1

Tente o seguinte

var names = (from dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy(name => name);

isso deve funcionar para o que você precisa.

Respondeu 07/08/2008 em 03:35
fonte usuário

votos
0

Você pode usar algo assim:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Respondeu 25/06/2018 em 10:56
fonte usuário

votos
0

Para resumo: todas as respostas têm algo em comum.

OrderBy precisa ser a operação final.

Respondeu 30/01/2018 em 16:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more