Considérant les enregistrements suivants:
Id F1 F2 F3
-------------------------------------------------
1 Nima 1990 10
2 Nima 1990 11
3 Nima 2000 12
4 John 2001 1
5 John 2002 2
6 Sara 2010 4
Je veux grouper par basé sur le champ F1
et trier par Id
et obtenir tous les champs du premier enregistrement du groupe semblable à ces enregistrements:
Id F1 F2 F3
-------------------------------------------------
1 Nima 1990 10
4 John 2001 1
6 Sara 2010 4
Comment puis-je faire cela en utilisant linq?
var res = from element in list
group element by element.F1
into groups
select groups.OrderBy(p => p.F2).First();
var result = input.GroupBy(x=>x.F1,(key,g)=>g.OrderBy(e=>e.F2).First());
L’avertisseur de @Alireza est tout à fait correct, mais vous devez remarquer que lorsque vous utilisez ce code
var res = from element in list
group element by element.F1
into groups
select groups.OrderBy(p => p.F2).First();
ce qui est similaire à ce code parce que vous commandez la liste puis faites le regroupement pour obtenir la première ligne de groupes
var res = (from element in list)
.OrderBy(x => x.F2)
.GroupBy(x => x.F1)
.Select()
Maintenant, si vous voulez faire quelque chose de plus complexe comme prendre le même résultat de regroupement mais prendre le premier élément de F2 et le dernier élément de F3 ou quelque chose de plus personnalisé, vous pouvez le faire en étudiant le code ci-dessous
var res = (from element in list)
.GroupBy(x => x.F1)
.Select(y => new
{
F1 = y.FirstOrDefault().F1;
F2 = y.First().F2;
F3 = y.Last().F3;
});
Donc, vous obtiendrez quelque chose comme
F1 F2 F3
-----------------------------------
Nima 1990 12
John 2001 2
Sara 2010 4
Utilisez-le pour réaliser ce que vous voulez. Ensuite, décidez quelles propriétés vous souhaitez retourner.
yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)