Count ou Count() – c# .net linq

Pergunta:


Tendo uma lista, qual melhor forma de saber o número de itens nessa lista e qual a diferença?

if (minhaLista.Count > 0) ;

ou

if (minhaLista.Count() > 0) ;

Autor da pergunta Pablo Tondolo de Vargas

LINQ

A melhor forma é sempre usar Count, ela é incrementada sempre que um item é adicionado à lista e decrementada sempre que um item é removido.

A diferença entre os dois é que Count é uma propriedade de List e Count() é um método de extensão do namespace System.Linq.

No caso de List‘s, o método Count() verifica se o objeto é realmente um ICollection e depois retorna a propriedade Count (em outros casos ele pode executar algum algoritmo para obter a contagem). Usando diretamente a propriedade você acaba evitando esta verificação.

Aqui você pode encontrar o fonte do método (repare na terceira linha)

public static int Count<TSource>(this IEnumerable<TSource> source) 
{
    if (source == null) throw Error.ArgumentNull("source");
    ICollection<TSource> collectionoft = source as ICollection<TSource>;
    if (collectionoft != null) return collectionoft.Count;
    ICollection collection = source as ICollection;
    if (collection != null) return collection.Count;
    int count = 0;
    using (IEnumerator<TSource> e = source.GetEnumerator()) {
        checked {
            while (e.MoveNext()) count++;
        }
    }
    return count;
}

De maneira geral sempre que puder usar a propriedade Count é melhor porque o acesso é direto. A expectativa é que ela sempre seja O(1).

Count() é um método de extensão do LINQ, portanto só pode usar em objetos que implementem IEnumerable que poderá executar algum algoritmo para obter a contagem. Se o objeto em questão implementar a interface ICollection o que ele fará é justamente ler a propriedade Count, o resultado será o mesmo e o tempo de resposta quase idêntico, mas bem ligeiramente mais lento por ter uma indireção. Mas ambos terão complexidade O(1). Note que isto não é garantido usando este método, depende do contexto.

O fonte dele pode ser visto no Reference Source do .Net.

O Count é uma propriedade manipulada pela sua lista, que é incrementada conforme você aplica um Add na lista, ou seja, você tem um acesso direto ao valor ao usa-la.

O Count() é um método de extensão que vem do namespace System.Linq, sua implementação consiste em varrer o IEnumerable e efetuar a contagem (ou tentar buscar a propriedade Count, caso seja uma implementação vinda de ICollection), ou seja, no fim eles acabam usando a mesma propriedade nesse cenário. Aqui está a implementação dele:

  public static int Count<TSource>(this IEnumerable<TSource> source) {
        if (source == null) throw Error.ArgumentNull("source");
        ICollection<TSource> collectionoft = source as ICollection<TSource>;
        if (collectionoft != null) return collectionoft.Count;
        ICollection collection = source as ICollection;
        if (collection != null) return collection.Count;
        int count = 0;
        using (IEnumerator<TSource> e = source.GetEnumerator()) {
            checked {
                while (e.MoveNext()) count++;
            }
        }
        return count;
    }

O melhor a se usar é o Count neste caso.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *