Pergunta

Qual é o melhor/mais fácil maneira de se obter uma contagem de itens dentro de uma coleção IEnumerable sem enumerar todos os itens da coleção?

Possível com LINQ ou Lambda?

Foi útil?

Solução

Você vai ter que enumerar para obter uma contagem.Outras construções, como a Lista de manter uma contagem de execução.

Outras dicas

A solução depende de qual você não quer enumerar a coleção.

Se é porque enumerar a coleção pode ser lento, então não existe uma solução que vai ser mais rápido.Você pode querer considerar o uso de uma ICollection em vez disso, se possível.A menos que a enumeração é bastante lenta (por exemplo,ele lê os itens a partir do disco) a velocidade não deve ser um problema, porém.

Se é porque enumerar a coleção vai exigir mais código, em seguida, ele já foi escrito para você, na forma do .Count() método de extensão.Basta usar MyEnumerable.Count().

Se é porque você quer ser capaz de enumerar a coleção depois de ter contado, em seguida, o .Count() extensão método permite isso.Você ainda pode chamar .Count() em uma coleção que você está no meio de enumerar e ele vai continuar de onde estava antes da contagem.Por exemplo:

foreach (int item in Series.Generate(5))
{
    Console.WriteLine(item + "(" + myEnumerable.Count() + ")");
}

vai dar o resultado

0 (5)

1 (5)

2 (5)

3 (5)

4 (5)

Se é porque a enumeração tem efeitos colaterais (por exemplo,escreve para o disco/console) ou é dependente de variáveis que podem alterar entre a contagem e enumeração (e.g.lê do disco) [N. B.Se possível, gostaria de sugerir a repensar a arquitetura, pois isso pode causar uma série de problemas], em seguida, uma possibilidade a considerar é a leitura da enumeração em um intermitentes de armazenamento.Por exemplo:

List<int> seriesAsList = Series.Generate(5).ToList();

Todos os acima partem do princípio de que você não pode alterar o tipo (i.e.ele é devolvido a partir de uma biblioteca de que você não possua).Se possível, você pode querer considerar uma mudança para utilizar uma ICollection ou IList (ICollection sendo mais amplamente o escopo de IList), que tem uma Contagem de propriedade sobre ele.

Em qualquer caso, você precisa percorrer-lo.Linq oferece a Count método:

var result = myenum.Count();

Use este.

IEnumerable list =..........;

list.OfType<T>().Count()

ele irá retornar a contagem.

Há também IList ou ICollection, se você deseja usar uma construção que ainda é pouco flexível, mas também tem a funcionalidade que você necessita.Ambos implicam IEnumerable.

Também depende do que você deseja alcançar através da contagem..Se você está interessado para saber se o enumerável coleção tem todos os elementos, você pode usar

myEnumerable.Nenhuma() mais de myEnumerable.Count (), onde o ex-irá produzir o primeiro elemento e o posterior rendimento de todos os elementos.

Um IEnumerable terá que percorrer cada item.para obter a contagem total.Se você só precisa verificar se há um ou mais itens em um IEnumerable um método mais eficiente é verificar se há qualquer.Nenhum() de verificação só de ver que há um valor e não um loop através de tudo.

IEnumerable myStrings = new Lista(){"um","dois", "três"};

bool hasValues = myStrings.Qualquer();

Não é possível com o LINQ, como a chamada .Contagem(...) não enumerar a coleção.Se você estiver executando em um problema para o qual você não pode iterar por uma coleção duas vezes, tente isso:

List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;

foreach (MyTableItem in myList)
{
   ...
}

Se você precisa de contagem e, em seguida, loop, você pode ser melhor fora com uma lista.

Se você estiver usando a contagem de seleção para membros que você pode usar Any() para evitar a enumeração de toda a coleção.

A melhor solução -como eu acho que é fazer o seguinte:

  1. usando o Sistema.Linq.Dinâmico;
  2. myEnumerable.AsQueryable().Count()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top