Group items inside a foreach [closed]

-5

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

It will look something like this:

Prod: 2345
Nat. Oper: 5402

Prod: 2343
Nat. Oper: 5402

Prod: 46123
Nat. Oper: 5404

How do I group? In the example above you would have two groups.

    
asked by anonymous 04.04.2018 / 01:12

2 answers

1

With a simple structure 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 let's 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 visualization, will be:

[
   {
      "NatOper":5402,
      "Produtos":[
         {
            "Prod":2345,
            "NatOper":5402
         },
         {
            "Prod":2343,
            "NatOper":5402
         }
      ]
   },
   {
      "NatOper":5404,
      "Produtos":[
         {
            "Prod":46123,
            "NatOper":5404
         }
      ]
   }
]
    
04.04.2018 / 15:03
0

Using dictionaries you can do this grouping quietly.

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 NatureOperation object as well.

    
05.04.2018 / 03:04