Encontrei este método:
public async Task SomeMethod(IEnumerable<Member> members)
{
await DoSomething(members.First());
await DoSomethingElse(members.First());
}
Está sendo chamado assim:
List<Member> members = GetMembers();
await SomeMethod(members);
Eu sei que isso poderia ser particularmente ruim se GetMembers()
retornasse um IQueryable<Member>
, mas como é apenas um List<Member>
, ainda é ruim ligar First()
duas vezes assim? É uma prática recomendada chamar First()
uma vez e armazenar o resultado em uma variável?
First
funcionar emSystem.Linq.Enumerable
Veja
System.Linq.Enumerable
comoFirst
a função foi implementada:TryGetFirst
foi chamado, vamos dar uma olhada:Aí
TryGetFirstNonIterator
foi chamado, vamos dar uma olhada:Como podemos ver, ele retorna list[0] se a origem for
IList<TSource>
. Código fonteSugestão para
SomeMethod
Independentemente de como
First
foi implementado. A pergunta que você fez:Acho que sobrecarregar é tudo que você precisa.
Sim, porque você não sabe como o método será utilizado. Mesmo que seja usado apenas com uma lista hoje , alguém poderá fazer outra coisa amanhã. Como chamá-lo com algo assim:
Nesse caso, todas as chamadas
.First()
precisariam ser executadasVeryExpensiveFunction()
.Armazenar o resultado em uma variável é uma boa solução, ou você pode declarar o método como
SomeMethod(List<Member> members)
, ouSomeMethod(IReadOnlyList<Member> members)
, caso realmente precise iterá-lo várias vezes.