Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

Quizz 3

L'idée ici est de faire du C#3, pas du C#2, tant pis pour la perf, ce n'est pas le but ici.

On a un IEnuemrable<int> et on veut récupérer pour chaque valeur de notre IEnumerable le nombre maximum d'occurences succésives.

Le code suivant :

static void Main(string[] args)

{

    var tab = new int[] { 3, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 3, 2, 2, 2, 2 };

    foreach (var v in SuccessiveIterationMax(tab).OrderByDescending(i => i.Value).ThenBy(i => i.Key))

        Console.WriteLine("{0} : {1}", v.Key, v.Value);

}

 

static IEnumerable<KeyValuePair<int, int>> SuccessiveIterationMax(IEnumerable<int> values)

{

  // Just code it Smile

}

donnera le résultat suivant :

2 : 4
1 : 3
3 : 1

Pourquoi ?

2 -> 4 :
3, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 3, 2, 2, 2, 2

1 -> 3 :
3, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 3, 2, 2, 2, 2

3 -> 1 :
3, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 3, 2, 2, 2, 2

Enjoy Smile

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié lundi 11 août 2008 13:32 par Matthieu MEZIL

Classé sous : , , ,

Commentaires

# re: Quizz 3 @ lundi 11 août 2008 16:08

bon la le quizz est clair

en C# 2.0 c'est assez facile, maintenant faut le faire en 3.5.....

on a le droit aux bloucles ?

FredD

# re: Quizz 3 @ lundi 11 août 2008 16:18

Tu peux faire ce que tu veux du moment que c'est du C#3. Je ne prétend pas avoir la meilleure solution possible donc tout est envisageable. Tu peux même rajouter une nouvelle méthode si tu veux.

Matthieu MEZIL

# re: Quizz 3 @ lundi 11 août 2008 17:19

var q = values.Select((value, index) => new KeyValuePair<int, int>(value, values.Skip(index).TakeWhile(i => value == i).Count())).GroupBy(o => o.Key).Select(o => o.OrderByDescending(p => p.Value).First());

cyril

# re: Quizz 3 @ lundi 11 août 2008 17:47

Bien joué Cyril Wink

Pour ma part je proposerais ça :

static IEnumerable<KeyValuePair<int, int>> SuccessiveIterationMax(IEnumerable<int> values)

{

    return from v in values.Distinct()

           let max = values.Select((value, index) => values.Skip(index).TakeWhile(v2 => v2 == v).Count()).Max()

           select new KeyValuePair<int, int>(v, max);

}

ou alors en un peu moins C#3 mais plus performant ça :

static IEnumerable<KeyValuePair<int, int>> SuccessiveIterationMax(IEnumerable<int> values)

{

    return from v in values.Distinct()

           select new KeyValuePair<int, int>(v, SuccessiveIterationLength(values, v).Max());

}

 

static IEnumerable<int> SuccessiveIterationLength(IEnumerable<int> values, int value)

{

    while (values.Any())

    {

        values = values.SkipWhile(v => v != value);

        int result = values.TakeWhile(v => v == value).Count();

        yield return result;

        values = values.Skip(result);

    }

    yield return 0;

}

Dans tous les cas bravo, très peu de développeurs ont fait attention au fait qu'il y avait deux méthodes Select : la classique + une avec l'index de la position courante.

Matthieu MEZIL

# re: Quizz 3 @ lundi 11 août 2008 17:50

On pourrait d'ailleurs directement faire ceci :

static void Main(string[] args)

{

    var tab = new int[] { 3, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 3, 2, 2, 2, 2 };

    foreach (var v in from v in tab.Distinct()

                      let max = tab.Select((value, index) => tab.Skip(index).TakeWhile(v2 => v2 == v).Count()).Max()

                      orderby max descending, v

                      select new KeyValuePair<int, int>(v, max))

        Console.WriteLine("{0} : {1}", v.Key, v.Value);

}

Matthieu MEZIL

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Etendre le Team Web Access de TFS 2012 – Step 0 par Philippe Didiergeorges Aka Philess le 05-23-2013, 23:48

- Simuler facilement l’envoi de mail par Blog de Jérémy Jeanson le 05-22-2013, 12:52

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le 05-20-2013, 14:50

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 12:59

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:09

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:03

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 08:27

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21