Como posso converter a List<MyObject>
em IEnumerable<MyObject>
e depois voltar?
Quero fazer isso para executar uma série de instruções LINQ na Lista, por exemplo Sort()
c#
linq
list
ienumerable
TK.
fonte
fonte
Respostas:
fonte
using System.Linq;
ou você não conseguirá ToList ()A
List<T>
é umIEnumerable<T>
, então, na verdade, não há necessidade de 'converter' aList<T>
em umIEnumerable<T>
. Como aList<T>
é umIEnumerable<T>
, você pode simplesmente atribuir aList<T>
a uma variável do tipoIEnumerable<T>
.Ao contrário, nem todo
IEnumerable<T>
é umList<T>
offcourse, então você terá que chamar oToList()
método membro doIEnumerable<T>
.fonte
A
List<T>
já é umIEnumerable<T>
, portanto, você pode executar instruções LINQ diretamente em suaList<T>
variável.Se você não vir os métodos de extensão LINQ, como
OrderBy()
estou supondo, é porque você não tem umausing System.Linq
diretiva no arquivo de origem.Você precisa converter o resultado da expressão LINQ de volta em um
List<T>
explicitamente, no entanto:fonte
À parte: Observe que os operadores LINQ padrão (conforme o exemplo anterior) não alteram a lista existente -
list.OrderBy(...).ToList()
criarão uma nova lista com base na sequência reordenada. É muito fácil, no entanto, criar um método de extensão que permite usar lambdas comList<T>.Sort
:Então você pode usar:
Isso atualiza a lista existente da mesma maneira que
List<T>.Sort
normalmente faz.fonte
ToList
- vou esclarecer, no entanto.Convertendo
List<T>
paraIEnumerable<T>
List<T>
implementaIEnumerable<T>
(e muitos outros comoIList<T>, ICollection<T>
), portanto, não há necessidade de converter um List de volta em IEnumerable, pois ele já aIEnumerable<T>
.Exemplo:
Você também pode usar o
Enumerable.AsEnumerable()
métodoConvertendo
IEnumerable<T>
paraList<T>
Isso é útil no Entity Framework .
fonte
Para evitar a duplicação na memória, resharper está sugerindo o seguinte:
.ToList () retorna uma nova lista imutável. Portanto, as alterações em listAgain não afetam myList na resposta do @Tamas Czinege. Isso está correto na maioria dos casos por pelo menos dois motivos: Isso ajuda a evitar mudanças em uma área afetando a outra área (acoplamento fraco) e é muito legível, uma vez que não devemos projetar código com preocupações de compilador.
Mas há certos casos, como estar em um loop apertado ou trabalhar em um sistema embutido ou com pouca memória, onde as considerações do compilador devem ser levadas em consideração.
fonte