Home > OS >  GROUP BY to List<> with Linq
GROUP BY to List<> with Linq

Time:09-07

I'm new to using Linq so I don't understand some things or its syntax. I want to group a list and then loop through it with foreach, like my logic below. Obviously my logic doesn't work.

My code:

var final = finalv.Union(finalc);
final = final.GroupBy(x => x.Clave);

foreach (var articulo in final)
{
    Articulo articulo2 = new Articulo();
    articulo2.ArtID = articulo.ArtID;
    articulo2.Clave = articulo.Clave;
    articulo2.ClaveAlterna = articulo.ClaveAlterna;
    lista.Add(articulo2);
}

CodePudding user response:

First, such usage is syntactically consistent with this overloaded method of GroupBy: GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>), and it will return a IEnumerable<IGrouping<TKey,TSource>> variable.

That means, if you run final.GroupBy(x => x.Clave), let's assume he returns finalWithGrouped, then finalWithGrouped.Key is the key and finalWithGrouped.ToList() is a collection of all variables with the same key(at here, it is with the same Clave).

And for your code, try this:

var final = finalv.Union(finalc);
var finalWithGrouped = final.GroupBy(x => x.Clave);
    
foreach (var articulosWithSameClavePair in finalWithGrouped)
{
    var clave = articulosWithSameClavePair.Key;
    var articulos = articulosWithSameClavePair.ToList();
        
    foreach(var articulo in articulos)
    {
        Articulo articulo2 = new Articulo();
        articulo2.ArtID = articulo.ArtID;
        articulo2.Clave = articulo.Clave;
        articulo2.ClaveAlterna = articulo.ClaveAlterna;
        lista.Add(articulo2);
    }
}

I suggest you read some examples of using GroupBy.

CodePudding user response:

When you group a list, it will return a key and groued list and you are trying reach a single property of a list.

When you group an data, you can convert it to dictionary, It is not nessesary but better way for me. You can try this code:

    var final = finalv.Union(finalc);
    final = final.GroupBy(x => x.Clave).ToDictionary(s=> s.Key, s=> s.ToList();
    
    foreach (var articulo in final)
    {
        foreach (var articuloItem in articulo.value)
       {
        Articulo articulo2 = new Articulo();
        articulo2.ArtID = articuloItem.ArtID;
        articulo2.Clave = articuloItem.Clave;
        articulo2.ClaveAlterna = articuloItem.ClaveAlterna;
        lista.Add(articulo2);
       }
    }
  • Related