Como obtenho uma lista ordenada e distinta de nomes de um DataTable usando LINQ?
Pergunta
eu tenho um DataTable
com um Name
coluna.Quero gerar uma coleção de nomes exclusivos ordenados em ordem alfabética.A consulta a seguir ignora o ordenar por cláusula.
var names =
(from DataRow dr in dataTable.Rows
orderby (string)dr["Name"]
select (string)dr["Name"]).Distinct();
Por que o orderby
não ser aplicado?
Solução
Para torná-lo mais legível e fácil de manter, você também pode dividi-lo em várias instruções LINQ.
- Primeiro, selecione seus dados em uma nova lista, vamos chamá-la
x1
, faça uma projeção se desejar - Em seguida, crie uma lista distinta, de
x1
emx2
, usando qualquer distinção necessária - Por fim, crie uma lista ordenada, a partir de
x2
emx3
, classificando pelo que você deseja
Outras dicas
O problema é que o operador distinto não concede que manterá a ordem original dos valores.
Portanto, sua consulta precisará funcionar assim
var names = (from DataRow dr in dataTable.Rows
select (string)dr["Name"]).Distinct().OrderBy( name => name );
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Experimente o seguinte:
dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
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.
Para abstrair:todas as respostas têm algo em comum.
OrderBy precisa ser a operação final.
Você pode usar algo assim:
dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow