Eu tenho alguns métodos que retornam diferentes listas genéricas.
Existe no .net algum método estático de classe ou qualquer outra coisa para converter qualquer lista em uma tabela de dados? A única coisa que posso imaginar é usar o Reflection para fazer isso.
Se eu tenho isso:
List<Whatever> whatever = new List<Whatever>();
(Este próximo código não funciona, é claro, mas eu gostaria de ter a possibilidade de:
DataTable dt = (DataTable) whatever;
Respostas:
Aqui está uma boa atualização de 2013 usando o FastMember do NuGet:
Isso usa a API de metaprogramação do FastMember para obter o máximo desempenho. Se você deseja restringi-lo a membros específicos (ou aplicar o pedido), também pode fazer isso:
Do editor Dis / reclamante: FastMember é um projecto Marc Gravell. Seu ouro e moscas cheias!
Sim, esse é exatamente o oposto deste ; reflexão seria suficiente - ou se você precisar mais rápido,
HyperDescriptor
em 2.0 ou talvezExpression
em 3.5. Na verdade,HyperDescriptor
deve ser mais do que adequado.Por exemplo:
Agora, com uma linha, você pode fazer isso muitas vezes mais rápido que a reflexão (ativando
HyperDescriptor
o tipo de objetoT
).editar consulta de desempenho re; aqui está uma plataforma de teste com resultados:
Eu suspeito que o gargalo mudou do acesso dos membros ao
DataTable
desempenho ... duvido que você melhore muito nisso ...código:
fonte
Eu tive que modificar o código de exemplo de Marc Gravell para lidar com tipos e valores nulos. Eu incluí uma versão de trabalho abaixo. Obrigado Marc.
fonte
public static DataTable ToDataTable<TKey, T>(this IEnumerable<IGrouping<TKey, T>> data)
Em seguida, adicione uma coluna extra antes do loop foreach:table.Columns.Add("Key", Nullable.GetUnderlyingType(typeof(TKey)) ?? typeof(TKey));
E adicione um loop ao redor do loop de dados onde você itera os grupos: foreach (IGrouping <TKey, T> grupo de dados) {foreach (item de T em group.Items) {Veja este GIST para mais detalhes: gist.github.com/rickdailey/8679306ToDataTable
método. SeT
implementa uma interface,typeof(T)
pode retornar o tipo de interface em vez da classe real do objeto, resultando em um vazioDataTable
. Substituí-lo pordata.First().GetType()
deve corrigi-lo.Uma pequena alteração na resposta de Marc para fazê-lo funcionar com tipos de valor como
List<string>
a tabela de dados:fonte
Esta é uma mistura simples de soluções. Funciona com tipos anuláveis.
fonte
Vale a pena visitar este link no MSDN: Como: Implementar CopyToDataTable <T> Onde o tipo genérico T não é um DataRow
Isso adiciona um método de extensão que permite fazer isso:
fonte
Outra abordagem é a acima:
fonte
fonte
A resposta de Marc Gravell, mas no VB.NET
fonte
tente isso
fonte
fonte
Eu mesmo escrevi uma pequena biblioteca para realizar essa tarefa. Ele usa reflexão apenas pela primeira vez que um tipo de objeto deve ser convertido em uma tabela de dados. Emite um método que fará todo o trabalho de conversão de um tipo de objeto.
É muito rápido. Você pode encontrá-lo aqui: ModelShredder no GoogleCode
fonte
Eu também tive que encontrar uma solução alternativa, pois nenhuma das opções listadas aqui funcionava no meu caso. Eu estava usando um IEnumerable que retornou um IEnumerable e as propriedades não puderam ser enumeradas. Isso fez o truque:
fonte
fonte
Eu percebo que isso foi fechado por um tempo; no entanto, eu tinha uma solução para esse problema específico, mas precisava de uma ligeira reviravolta: as colunas e a tabela de dados precisavam ser predefinidas / já instanciadas. Então eu precisava simplesmente inserir os tipos na tabela de dados.
Então, aqui está um exemplo do que eu fiz:
fonte
Uma resposta de 2019 se você estiver usando o .NET Core - use a biblioteca Nuget ToDataTable . Vantagens:
Isenção de responsabilidade - eu sou o autor de ToDataTable
Desempenho - eu incluo alguns testes de benchmark .Net e os incluí no repositório ToDataTable . Os resultados foram os seguintes:
Criando uma tabela de dados de 100.000 linhas :
O método FastMember sugerido na resposta de Marc parecia ter um desempenho pior do que a resposta de Mary, que usava reflexão, mas eu rolei outro método usando um FastMember
TypeAccessor
e ele teve um desempenho muito melhor. No entanto, o pacote ToDataTable superou o desempenho.fonte
Se você estiver usando o VB.NET, essa classe fará o trabalho.
fonte
se você tiver propriedades em sua classe, esta linha de código está OK !!
mas se você tiver todos os campos públicos, use este:
a resposta original é de cima, eu apenas editei para usar campos em vez de propriedades
e para usá-lo faça isso
fonte
Para converter uma lista genérica em tabela de dados, você pode usar o DataTableGenerator
Essa biblioteca permite converter sua lista em uma tabela de dados com vários recursos, como
fonte
fonte
Para converter lista genérica em DataTable
using Newtonsoft.Json;
fonte
Este é o aplicativo simples do console para converter List em Datatable.
fonte
Se você usar o método para aceitar campos com nulo.
fonte
fonte
Eu acho que é mais conveniente e fácil de usar.
fonte
Lista / dados = nova Lista (); var dataDT = Newtonsoft.Json.JsonConvert.DeserializeObject (Newtonsoft.Json.JsonConvert.SerializeObject (data));
fonte
A resposta mais simples pode ser essa:
[ https://stackoverflow.com/a/60776314/10235747orgeous[1]
fonte
Se você deseja usar a reflexão e definir a ordem das colunas / incluir apenas algumas colunas / Excluir algumas colunas, tente o seguinte:
fonte