Les liens de la semaine – Édition #149

Développement

.NET

Web

Technologie

Science et autres

Publicité

Comment utiliser la méthode SelectMany avec C# et .NET

Le billet d’aujourd’hui est à propos d’une méthode du framework .NET. SelectMany, vous connaissez? Pour ma part, je le connaissais seulement de par son nom. Surtout par ce qu’elle est très près de Select dans l’IntelliSense.

select

Ironiquement, c’est souvent de cette façon-là que je découvre de nouvelles fonctionnalités dans le framework .NET. Dans mon scénario, j’avais besoin de retrouver tous les départements liés à une collection d’utilisateurs.

Pour donner une idée, la structure de données et son initialisation prennent approximativement cette forme:


public class User
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<Department> Departments { get; set; }
}
public class Department
{
public Guid Id { get; set; }
public string Name { get; set; }
}
var users = new List<User>();
users.Add(new User
{
Departments = new List<Department>
{
new Department
{
Name = "Dept 1"
},
new Department
{
Name = "Dept 2"
},
},
Name = "French Coding",
});
users.Add(new User
{
Departments = new List<Department>
{
new Department
{
Name = "Dept 2"
},
new Department
{
Name = "Dept 3"
},
new Department
{
Name = "Dept 4"
},
},
Name = "Homme Poux",
});
users.Add(new User
{
Departments = new List<Department>
{
new Department
{
Name = "Dept 1"
},
new Department
{
Name = "Dept 4"
},
},
Name = "Pascal Paradis",
});

view raw

user.cs

hosted with ❤ by GitHub

Mon premier réflexe, afin de récupérer la liste de tous les départements, aurait été de faire une boucle comme celle-ci.


var departments = new List<Department>();
foreach(var user in users)
{
departments.AddRange(user.Departments);
}

view raw

depts-for.cs

hosted with ❤ by GitHub

Comme dirait l’autre: « Ça marche!« . Le seul problème que j’ai toujours eu avec cette approche c’est que c’est laid. C’est fonctionnel, mais c’est laid pareil.

Ceci étant dit, c’est à partir de cet instant que j’ai tenté de voir s’il n’y avait pas mieux. C’est en faisant mes recherches et, notamment, en utilisant les mots clés « C# LINQ List of List » que mon attention a été attirée vers SelectMany.

Je suis trop bon à Google, n’est-ce pas?

Comme la documentation MSDN le spécifie, SelectMany permet d’aplatir un résultat qui contient une liste d’une liste en une seule liste. Aussi simple que ça. Cependant, elle permet de faire un peu plus que cela. Par exemple, il est possible d’inclure des données de la collection parente dans la liste qui sera aplatie.

En reprenant l’initialisation mentionnée précédemment, considérez le code suivant.


var results = users.SelectMany(p => p.Departments, (user, departement) => new Tuple<string, string>(user.Name, departement.Name));
foreach(var userAndDepartment in results)
{
Console.WriteLine(string.Format("User: {0} – Department: {1}", userAndDepartment.Item1, userAndDepartment.Item2));
}
Console.ReadKey();

Va permettre de retourner de l’information comme ceci.

selectmany

Voilà, c’est tout!

Les liens de la semaine – Édition #148

Développement

.NET

Web

Technologie

Science et autres

Un résumé de mon demi-marathon à Lachine

Le 23 août dernier, j’ai participé à mon quatrième demi-marathon à vie. Cette journée a été spéciale pour moi, car je m’étais fixé l’objectif de réaliser ma course sous la barre des deux heures au demi-marathon de Montréal. Dans mon plan d’entrainement, la course de Lachine est considérée comme un test en vue de la grande course du 20 septembre.

Au mois de janvier passé, j’avais initialement opté pour un demi-marathon de moins de 02:10:00 pour septembre. Toutefois, puisque j’ai réalisé cet objectif en mai passé, j’ai pris la décision de me dépasser et d’y aller pour un demi-marathon sous le 02:00:00.

Ma dernière course datait donc du 10 mai dernier. Il s’était écoulé quinze semaines depuis ma participation à un événement de course. Durant cette période, il a fallu que je travaille sur un plan de transition pour augmenter mon rythme de course à l’entrainement et sur la planification de mon entrainement de dix semaines pour que cela concorde avec le demi-marathon Oasis de Montréal.

Les premières semaines d’entrainement avaient été assez intenses. À l’entrainement, mon rythme de base (6m 10s) était le même que celui que j’ai eu lorsque j’ai complété mon plus récent demi-marathon. C’était la seule façon d’y arriver, n’est-ce pas? Le plan d’entrainement actuel est calibré pour un demi-marathon en 01h 55m. Cela représente une course à un rythme d’environs 05m 27s. Ça commence à être quelque chose!

Le résultat

Sans plus tarder…

J’ai complété la distance du demi-marathon en 01:54:29.5. J’en suis trèèèèèèèèèèèèèèèèès fier! Il s’agit de mon meilleur résultat à vie au demi-marathon. Il est à noter qu’en plus d’avoir réalisé mon meilleur temps, j’ai aussi terminé dans la première moitié des coureurs pour le classement général (270/1067), par genre (217/567) et dans ma catégorie (61/125).

Du progrès

Ce qui me rassure le plus dans ma performance c’est le progrès vis-à-vis mes performances précédentes. Sommairement, cette progression ressemble à ceci:

  • Lachine 2014 : 02:23:39.7
  • Montréal 2014 : 02:29:53.9
  • Châteauguay 2015 : 02:09:20.1
  • Lachine 2015 : 01:54:29.5

Il y a plusieurs façons de regarder les résultats. J’ai retranché trente minutes en comparaison à mon temps de l’an passé à Lachine. J’ai aussi amélioré mon temps de quinze minutes en comparaison avec ma course du début de saison.

La performance en chiffres

lachine-stats

Deux choses sont à noter dans ces statistiques.

  • La constance aura été la clé de mon succès. J’ai maintenu un rythme moyen de 5:25 minutes/km pendant une très grande partie de la course. Les petites pointes représentent les brefs arrêts aux différentes stations d’hydratation.
  • Mon rythme cardiaque a augmenté graduellement pendant toute la course. Il a augmenté jusqu’à 190 BPM à la toute fin de la course.

En une photo

pascal-lachine

Yar! Ça, c’est du coureur!

Le prochain rendez-vous

Ma prochaine compétition sera le 20 septembre pour le demi-marathon au Marathon de Montréal. C’est une course significativement plus difficile que celle de Lachine en raison du dénivelé du parcours.

L’objectif de réaliser le demi-marathon à Montréal en dessous des deux heures est toujours celui que je vise. J’ai bien hâte de voir comment mes jambes vont prendre le coup. L’an passé, il y a quand même eu six minutes entre ma performance de Lachine et de Montréal.

Chose certaine, c’est que je n’ai jamais été aussi préparé et en forme qu’en ce moment. Je m’en vais à cette course avec le moral gonflé à bloc!