Array
(
)

Contar a quantidade de um determinado item em uma coleção

Julion
   - 26 mar 2009

Ola, boa tarde a todos.
Tenho uma coleção de produtos e gostaria de contar quantos deles é de uma determinada marca para exibir num label ao lado da marca na página, as marcas e seus respectivos ids já estão inseridos en cada item da coleção.

Como posso fazer isso?

Muito obrigado e um abraço

Ara.es
   - 27 mar 2009

Use LINQ to Objects, nele vc podera fazer uma query no C#, para te retornar a quantidade de items. Não sabendo a estrutura de sua lista fica dificil lhe passar o codigo de como fazer. Mas com o Linq é possível der uma olhada. Flw!!

Julion
   - 29 mar 2009

Ola ara.es, muito obrigado pela sua ajuda.
Puxar passou batido para mim o linq to object, estou dando uma boa olhada nele agora e me parece ser uma ferramenta e tanto.

Quanto a minha coleção acho que fiz uma lambança danada aqui, mas acabou dando “certo”.
Como a contagem era por produto, toda a vez que um produto do mesmo fabricante era processado ele refazia a contagem e printava na pagina, então nos teste eu acabava ficando com vários fabricantes repetidos na pagina.

Então tentei filtrar antes da entrada, e meu código ficou assim:

private ArrayList fabIdList = new ArrayList();
private ColecaoDeProduto proColl = new ColecaoDeProduto(); //Minha Coleção tipada

private int FabCount(int produtoFabricanteId)
{
bool forResult = true;

foreach (var fab in fabIdList)
{
if ((int)fab == produtoFabricanteId)
{
forResult = false;
}

}

if (forResult)
{
int fabCount = proColl.Count(m => m.FabricanteId == produtoFabricanteId);
result = fabCount;
}

else
{
result = -1;
}

fabIdList.Add(produtoFabricanteId);

return result;
}

void rptrNarrowByFabricante_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
int fabCount = 0;
Produto produto = e.Item.DataItem as Produto;

if (produto == null) return;

fabCount = FabCount(produto.FabricanteId);

if (result == -1) return;

HyperLink hyFabCount = e.Item.FindControl(´hlNarrowByFabricante´) as HyperLink;
if (hyFabCount != null)
{
hyFabCount.Visible = true;
hyFabCount.Text = string.Format(´{0} ({1:N0})´, produto.Fabricante.Nome,
fabCount);
}

}
}

Você acha que devo criar uma nova colleção tipada, processar e daí adicionar o resultado a essa nova coleção e depois fazer um bind dela ao repeater?

Valeu
Um abraço

Julion
   - 02 abr 2009

Pesquisei outras formas de resolver o meu problema e acabei optando por alterar a store procedure para contar os produtos.
Um Simples COUNT acredito ser a forma mais apropriada.

Abraço a todos
:D