Não aceito: Enumerable vs List

Eu costumava trabalhar em uma equipe em que o LINQ era ligeiramente desagradável porque era supostamente difícil depurar esse código. Tínhamos um acordo: após cada cadeia LINQ, o desenvolvedor cria uma variável local para a qual ele escreve o resultado de ToArray (). Se a matriz é necessária mais abaixo no método ou se só funciona com IEnumerable. Antes do retorno, o resultado também foi lançado em uma matriz, parece que não havia métodos em toda a base de código que retornou ou aceitou uma coleção diferente de uma matriz.

Legado barbudo! - você vai pensar e terá razão. No entanto, apesar do fato de que muitos anos se passaram desde que o LINQ se tornou onipresente e os IDEs permitem que você visualize os dados na depuração, alguns desenvolvedores ainda têm uma ideia ruim dos critérios para escolher um tipo de aceitação e retorno quando se trata de coleções.

Para começar, qual é a coleção? Uma vez que BCL possui um tipo de dados com o mesmo nome, é importante entender que uma coleção é um tipo de dados projetado para operar em um grupo de elementos que possuem alguma característica comum (tipo de dados). Portanto, tudo o que pode ser enumerado é uma coleção.

Prefira abstrações

, , . , . ,   . , , .

Lazy loading

- (  IEnumerable)  , .  IList, , .   ,  lazy loading, — . . , 'Lazy' , , .

IReadOnlyCollection

, ,  IArray, IReadOnlyCollection,  -. 

namespace System.Collections.Generic 
{ 
  public interface IReadOnlyCollection : IEnumerable, IEnumerable 
  { 
    int Count { get; } 
  }
}

 -  4.5,  read-only . Array, List,  IList.

 IEnumerable  … ,  IReadOnlyCollection,       List. , -   List.

 Array  IReadOnlyCollection  List, .  IList    .

null

,  ,  ,  , ,  , ,  null.  null, .  - null  0 . 1  null,  null, ,  . :

 if(myEnumerable != null) 
 { 
   foreach(var item in myEnumerable) 
   { 
   } 
 }  

,   :

foreach(var item in myEnumerable ?? Enumerable.Empty<T>()) 
{
}

IEnumerable/ICollection/IList

, , :

IEnumerable

, -,

IReadOnlyCollection : IEnumerable

-,

ICollection : IEnumerable

, (IsReadOnly)

IReadOnlyList : IReadOnlyCollection

,

IList : ICollection

,

, , . , . IEnumerable , - ICollection, IList…   .

, , , . , , IReadOnlyCollection. IEnumerable , , , — -. lazy loading, IList ICollection, —  read-only .

Web API HTTP

HTTP, , -. , , , IEnumerable IList.

, HTTP JSON -  , . , (Newtonsoft.Json, System.Text.Json), List. \ - . IEnumerable response .


, , , , .

Eu ficaria feliz com as alterações e adições, recomendo que você se familiarize com as Diretrizes de design da estrutura para coleções .




All Articles