No C # 3.0, você pode criar classe anônima com a seguinte sintaxe
var o = new { Id = 1, Name = "Foo" };
Existe uma maneira de adicionar essas classes anônimas a uma lista genérica?
Exemplo:
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
List<var> list = new List<var>();
list.Add(o);
list.Add(o1);
Outro exemplo:
List<var> list = new List<var>();
while (....)
{
....
list.Add(new {Id = x, Name = y});
....
}
c#
.net
generics
anonymous-types
DHornpout
fonte
fonte
new[] { new{ Id = (int?)null, Name = "Foo" }, new { Id = (int?)1, Name = "Foo" }}
Respostas:
Você poderia fazer:
Existem várias maneiras de esfolar esse gato, mas basicamente todas elas usam inferência de tipo em algum lugar - o que significa que você precisa chamar um método genérico (possivelmente como um método de extensão). Outro exemplo pode ser:
Você entendeu a ideia :)
fonte
Aqui está a resposta.
fonte
string.Join
interpolação de método e string, portanto não há necessidade de usarforeach
eFormat
.Existem várias maneiras de fazer isso, mas algumas das respostas aqui estão criando uma lista que contém elementos de lixo, o que requer que você limpe a lista.
Se você estiver procurando por uma lista vazia do tipo genérico, use um Selecionar em uma lista de tuplas para fazer a lista vazia. Nenhum elemento será instanciado.
Aqui está uma lista para criar uma lista vazia:
Em seguida, você pode adicionar usando seu tipo genérico:
Como alternativa, você pode fazer algo como abaixo para criar a lista vazia (mas prefiro o primeiro exemplo, porque você pode usá-lo também para uma coleção povoada de Tuplas):
fonte
Enumerable.Empty<object>().Select(o=>definition).ToList()
Não exatamente, mas você pode dizer
List<object>
e as coisas vão funcionar. No entanto,list[0].Id
não vai funcionar.Isso funcionará em tempo de execução no C # 4.0 com um
List<dynamic>
, ou seja, você não obterá o IntelliSense.fonte
eu acho
vai funcionar.
Você também pode escrever dessa forma:
fonte
Eu costumo usar o seguinte; principalmente porque você "começa" com uma lista vazia.
Ultimamente, eu tenho escrito assim:
O uso do método repeat também permitiria:
..que fornece a lista inicial com o primeiro item já adicionado.
fonte
Você pode fazer isso no seu código.
fonte
Na versão mais recente 4.0, pode usar dinâmico como abaixo
fonte
Eu verifiquei o IL em várias respostas. Esse código fornece com eficiência uma lista vazia:
fonte
IEnumerable
, enquanto minha versão retornaList
, exatamente o que o OP pediu.new object[] { }.Select(o => new { Id = default(int), Name = default(string) }).ToList()
Aqui está a minha tentativa.
Eu vim com isso quando escrevi algo semelhante para fazer uma Lista Anônima para um tipo personalizado.
fonte
Você pode criar uma lista de dinâmica.
"dinâmico" é inicializado pelo primeiro valor adicionado.
fonte
Em vez disso:
Você pode fazer isso:
No entanto, você receberá um erro de compilação se tentar fazer algo assim em outro escopo, embora funcione em tempo de execução:
O problema é que apenas os membros do Object estão disponíveis no tempo de execução, embora o intellisense mostre o ID e o nome das propriedades .
No .net 4.0, uma solução é usar a palavra-chave dynamic istead of object no código acima.
Outra solução é usar a reflexão para obter as propriedades
fonte
Aqui está outro método de criar uma Lista de tipos anônimos que permite iniciar com uma lista vazia, mas ainda ter acesso ao IntelliSense.
Se você quiser manter o primeiro item, basta colocar uma letra na string.
fonte
fonte
Esta é uma pergunta antiga, mas pensei em colocar minha resposta em C # 6. Costumo configurar dados de teste que são facilmente inseridos no código como uma lista de tuplas. Com algumas funções de extensão, é possível ter este formato compacto e agradável, sem repetir os nomes em cada entrada.
Isso fornece um IEnumerable - se você deseja adicionar uma lista, basta adicionar ToList ().
A mágica vem da extensão personalizada Adicionar métodos para tuplas, conforme descrito em https://stackoverflow.com/a/27455822/4536527 .
}
A única coisa que eu não gosto é que os tipos são separados dos nomes, mas se você realmente não deseja criar uma nova classe, essa abordagem ainda permitirá que você tenha dados legíveis.
fonte
Estou muito surpreso que ninguém tenha sugerido inicializadores de coleção. Dessa forma, só é possível adicionar objetos quando a lista é criada, daí o nome, no entanto, parece a melhor maneira de fazê-lo. Não há necessidade de criar uma matriz e convertê-la em uma lista.
Você sempre pode usar em
object
vez de,dynamic
mas tentar mantê-lo de uma maneira genérica verdadeira,dynamic
faz mais sentido.fonte
Você pode fazer assim:
Parece um pouco "hacky" para mim, mas funciona - se você realmente precisa ter uma lista e não pode simplesmente usar a matriz anônima.
fonte
Para o seu segundo exemplo, em que você precisa inicializar uma nova
List<T>
, uma idéia é criar uma lista anônima e depois limpá-la.Ou, como método de extensão, deve ser mais fácil:
Ou provavelmente ainda mais curto,
fonte
Se você estiver usando o C # 7 ou superior, poderá usar tipos de tupla em vez de tipos anônimos.
fonte
Derivando dessa resposta , criei dois métodos que poderiam fazer a tarefa:
Você pode usar os métodos como
Essa resposta tem uma idéia semelhante, mas eu não a vi até depois de fazer esses métodos.
fonte
Tente com isto:
fonte
fonte