En voici un que j'ai bidouillé, alors n'hésitez pas à choisir des trous. Il faut un (ordonnée) de la liste d'entiers et qui renvoie une liste de chaînes de contiguë plages. par exemple:
1,2,3,7,10,11,12 --> "1-3","7","10-12"
La fonction (dans une classe statique):
public static IEnumerable<string> IntRanges(this IEnumerable<int> numbers)
{
int rangeStart = 0;
int previous = 0;
if (!numbers.Any())
yield break;
rangeStart = previous = numbers.FirstOrDefault();
foreach (int n in numbers.Skip(1))
{
if (n - previous > 1) // sequence break - yield a sequence
{
if (previous > rangeStart)
{
yield return string.Format("{0}-{1}", rangeStart, previous);
}
else
{
yield return rangeStart.ToString();
}
rangeStart = n;
}
previous = n;
}
if (previous > rangeStart)
{
yield return string.Format("{0}-{1}", rangeStart, previous);
}
else
{
yield return rangeStart.ToString();
}
}
Exemple d'utilisation:
this.WeekDescription = string.Join(",", from.WeekPattern.WeekPatternToInts().IntRanges().ToArray());
Ce code est utilisé pour convertir les données à partir d'un DailyWTF digne de calendrier d'application. WeekPattern est un masque de bits stockés dans une chaîne de caractères "0011011100...". WeekPatternToInts() qui convertit un IEnumerable<int>, dans ce cas [3,4,6,7,8], qui devient "3-4,6-8". Il fournit à l'utilisateur une description compacte de la scolaires semaine de plages qu'une conférence se produit sur.