ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Comment implementer un Do Case a la foxpro   



L'auteur

Gregory Adam
Belgique Belgique
Membre Actif (personne physique)
# 0000001121
enregistré le 04/06/2006

Fiche personnelle


Note des membres
pas de note

Contributions > 80 dotnet > 01 C#

Comment implementer un Do Case a la foxpro
# 0000000868
ajouté le 03/11/2013 12:09:12 et modifié le 03/11/2013
consulté 6396 fois
Niveau débutant


Le téléchargement des pièces jointes est limité aux membres
Veuillez vous identifier ou vous inscrire si vous n'avez pas encore de compte ...
Description

Exemple et classe ci-dessous

Code source :
  static class Test_Switch
  {
    internal static void Go()
    {

      int i = 7, j = 0;

      new Switch()
      .Case(() => i == 1, delegate { j = -1; })
      .Case(() => i == 2, delegate { j = -2; })
      .Case(() => i == 3, delegate { j = -3; })
      .Default(delegate { j = 1000; })
      .Execute();

      Console.WriteLine(" j = {0}", j); // 1000
      Console.ReadLine();


    }
  }

  class Switch
  {
    bool HadDefault = false;
    List<Tuple<Func<bool>, Action>> Cases = new List<Tuple<Func<bool>,Action>>();

    internal Switch Case(Func<bool> predicate, Action action)
    {
      CheckDefault();
      if (predicate == null)
        throw new ArgumentNullException("predicate");

      CheckAction(action);
      Cases.Add(new Tuple<Func<bool>, Action>(predicate, action));

      return this;
    }
    internal Switch Default(Action action)
    {
      CheckDefault();
      CheckAction(action);

      Cases.Add(new Tuple<Func<bool>,Action>(() => true, action));
      HadDefault = true;

      return this;
    }

    internal void Execute()
    {
      foreach( var item in Cases )
        ifitem.Item1() )
        {
          item.Item2();
          break;
        }
    }
    void CheckDefault()
    {
      if( HadDefault )
        throw new Exception("Sorry, already a Default");
    }
    void CheckAction(Action action)
    {
      if( action == null )
        throw new ArgumentNullException("action");
    }
  }
Commentaires
le 04/11/2013, eddymaue a écrit :
OUFFFFFF .... s'en en prend du code pour un simple

do case
case
otherwise
endcase

le 29/05/2015, Olivier Hamou a écrit :
Salut Gregory

Quel est l'avantage de ta routine par rapport au Switch c# ?

http://www.dotnetperls.com/switch

le 29/05/2015, Gregory Adam a écrit :
Olivier,

Si tu regardes bien le code qui
(a) Utilise des predicats
(b) avec Closure

Tu verras que les test
(a) se font dans l'ordre de l'ajout des predicats
(b) et l'action du premier qui retourne true est executee

Tu pourrais avoir un test sur autre chose que la variable i

int i = 1, j = 0;

string a = "ab";

new Switch()
.Case(() => a == "ab", delegate { j = -1; })
.Case(() => i == 2, delegate { j = -2; })
.Case(() => i == 3, delegate { j = -3; })
.Default(delegate { j = 1000; })
.Execute();
Console.WriteLine(" j = {0}", j); // 1000
Console.ReadLine();


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2020.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3