Group items within a foreach

Asked

Viewed 239 times

-5

I have an object that brings me a basket with several items. I need inside a foreach to group the items by nature of operation. How I do this?

It’ll be something like this:

Prod: 2345
Nat. Oper: 5402

Prod: 2343
Nat. Oper: 5402

Prod: 46123
Nat. Oper: 5404

How do I group? In the above example there would be two groups.

  • If you have a code?

  • @Virgilionovic, I don’t have it. This is something new to implement and I still don’t know how to do.

  • You want a generic answer then?

  • @Virgilionovic, that’s right

  • One could say in your question where the data comes from and why of the foreach

  • The foreach is for an Insert per product. The data comes from a proc through a service. Dude I’m lost here.

  • And what do you mean by group?

Show 2 more comments

2 answers

1

With a simple structure you and using LINQ (System.Linq) you can solve this problem as follows:

Create a structure to store your groups

public class NaturezaOperacao
{
    public int NatOper { get; set; }
    public List<Produto> Produtos { get; set; }

    public NaturezaOperacao()
    {
        //Inicialiando a lista para evitar problemas de null reference;
        Produtos = new List<Produto>();
    }
}

And we will call your input object as Product and represent it as follows.

public class Produto
{
    public int Prod { get; set; }
    public int NatOper { get; set; }
}

Now comes the Linq and a foreach() for you to group the products by NatOper

//Sua lista de entrada
var produtosInput = new List<Produto>
{
    new Produto { Prod = 2345, NatOper = 5402 },
    new Produto { Prod = 2343, NatOper = 5402 },
    new Produto { Prod = 46123, NatOper = 5404 }
};

var gruposNaturezaOperacao = new List<NaturezaOperacao>();

//Selecionando as NatOper distintas que que existem na entrada
foreach (var natureza in produtosInput.Select(n => n.NatOper).Distinct())
{
    gruposNaturezaOperacao.Add(new NaturezaOperacao
    {
        NatOper = natureza,
        Produtos = produtosInput.Where(p => p.NatOper == natureza).ToList()
    });
}

The final result for gruposNaturezaOperacao, represented in JSON for easy viewing, will be:

[
   {
      "NatOper":5402,
      "Produtos":[
         {
            "Prod":2345,
            "NatOper":5402
         },
         {
            "Prod":2343,
            "NatOper":5402
         }
      ]
   },
   {
      "NatOper":5404,
      "Produtos":[
         {
            "Prod":46123,
            "NatOper":5404
         }
      ]
   }
]

0

Using dictionaries you can perform this grouping smoothly.

Example:

Dictionary<Int32, List<Produto>> dicionárioDeNaturezas = new  Dictionary<Int32,List<Produto>>(); 

foreach(var umProduto in produtos)
{
    if(dicionárioDeNaturezas.ContainsKey(umProduto.NaturezaId)
    {
        if(dicionárioDeNaturezas[umProduto.NaturezaId].SingleOrDefault(x => x.Id.Equals(umProduto.id) == null)
        {
             dicionárioDeNaturezas[umProduto.NaturezaId].Add(umProduto);
        }
    }
    else
    {
        dicionárioDeNaturezas.Add(umProduto.NaturezaId, new List<Produto>());
        dicionárioDeNaturezas[umProduto.NaturezaId].Add(umProduto);
    }
}

So you have all products grouped by nature of operation. In the example I used the nature ID, but you can use the Nature Object operation as well.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.