2009-07-23 6 views
0

J'ai une référence de classe. Lorsque vous créez un objet dans la classe, il vérifie que les chaînes d'entrée sont uniques (et n'autorise donc jamais les objets en double). Mais quand je trouve que la chaîne d'entrée str1 est égale à celle d'un objet précédemment créé, au lieu de créer un nouvel objet ou de simplement retourner false, je veux changer une propriété de l'objet déjà créé. Mais je ne peux pas comprendre comment faire cela, car la méthode n'a aucun moyen de connaître le nom de l'objet. Mais je sais quelque chose d'unique à ce sujet! Je me sens comme cela doit être assez pour en quelque sorte l'appeler, et faire ce que je dois faire.C# appeler l'objet par la propriété unique

Des idées?
MERCI!

Voici la classe:

public class Referral 
{ 
    public class Referral 
    { 
     public string URL; 
     public Dictionary<string, int> Keywords = new Dictionary<string, int>(); 

     private static Dictionary<string, string> URLs = new Dictionary<string, string>(); 
     private int HowManyURLs; 
     private bool UniqueURL; 
     private bool UniqueKeyword; 

     public Referral(string MyURL, string MyKeyword, int MyOccurrences) //Constructor 
     { 
    if (HowManyURLs == 0) 
    { 
     URL = MyURL; 
     Keywords.Add(MyKeyword, MyOccurrences); 
     URLs.Add(MyURL, MyKeyword); 
     HowManyURLs++; 
    } 

    else 
    { 
     // RESET FLAGS 
     UniqueURL = true; 
     UniqueKeyword = true; 

     for (int i = 0; i < HowManyURLs; i++) 
     { 
     if (URLs.ContainsKey(MyURL)) 
     { 
      // TRIP URL FLAG 
      UniqueURL = false; 

      // NOW CHECK KEYWORDS OF URL << THIS IS WHAT I CAN'T DO! 
      if (URLs.ContainsKey(MyKeyword)) 
      { 
      // TRIP KEYWORD FLAG 
      UniqueKeyword = false; 

      // ADD TO OCCURRENCES 
    //  Referral[MyURL].Occurrences += MyOccurrences; 
      } 
     } 
     } 

    // IF BOTH FLAGS TRUE 
    if (UniqueURL == true && UniqueKeyword == true) 
    { 
     URL = MyURL; 
     Keywords.Add(MyKeyword, MyOccurrences); 
     URLs.Add(MyURL, MyKeyword); 
     HowManyURLs++; 
    } 

    } 

     } 
    } 
+0

Je suis un peu confus au sujet de ce que vous essayez de faire quand il s'agit à la fois de votre question et de votre code. Pour une chose, ce n'est pas une méthode, c'est un constructeur donc retourner false n'est pas une option et ne pas créer une nouvelle référence n'est pas une option. Votre boucle for apparaît également effectuer les mêmes contrôles chaque fois à travers la boucle sans aucun changement. Est-ce que votre seconde devrait être: if (Keywords.ContainsKey (MyKeyword)) ? – drs9222

Répondre

0

Pourquoi ne pas créer une liste d'objets d'orientation en dehors de l'objet de référence lui-même? De cette façon, vous pouvez vérifier la liste pour voir si l'objet avec vos critères existe déjà. Si c'est le cas, mettez à jour cet objet. Sinon, créez-en un nouveau et ajoutez-le à la liste.

Soit cela ou utiliser une liste statique, également déclarée en dehors de la classe Referrals.

Je ne suis pas sûr à 100% où vous allez avec ceci, donc j'espère que l'une de ces approches fonctionnera pour vous.

+0

Pourquoi en dehors de la classe Referral? Si le seul endroit où il est utilisé est dans le constructeur Referral, il n'y a aucune raison de l'exposer en dehors de la classe. –

+0

il me semble qu'ils essaient de maintenir une collection d'objets, et que vous voulez ajouter de nouveaux objets quand ils n'existent pas et mettre à jour un existant quand il en existe un. Une collection de ces objets semble être le meilleur moyen d'y parvenir. –

0

Essayez d'utiliser la méthode Dictionary.TryGetValue? Je n'ai pas très bien compris ce que vous essayez de faire avec votre code, et c'est un peu tard.

0

Vous devez créer une classe de contrôleurs qui gèrera une collection d'objets de référence afin d'effectuer la vérification préalable et la mise à jour de l'objet.

Quelque chose comme:

public class Referrals 
{ 
    private List<Referral> refs; 

    public class Referrals() 
    { 
     this.refs = new List<Referral>(); 
    } 

    public Referral Add(string MyURL, string MyKeyword) 
    { 
     var ref = this.refs.Find(delegate(Referral r) { return r.URL == MyURL; }); 
     if (ref != null) 
     { 
      if (ref.Keyword == MyKeyword) 
      { 
       ref.IncrementOccurrences(); 
      } 
     } 
     else 
     { 
      ref = new Referral(MyURL, MyKeyword); 
      this.refs.Add(ref); 
     } 
     return ref; 
    } 
} 

Et je changerais votre classe de recommandation de ne pas prendre en Occurrences comme variable. Cela devrait être manipulé en privé à l'objet:

public class Referral 
{ 
    private string url; 
    private string keyword; 
    private int occurrences; 

    public Referral(string MyURL, string MyKeyword) 
    { 
     this.url = MyURL; 
     this.keyword = MyKeyword; 
     this.occurrences = 1; 
    } 

    public int Occurrences { get { return this.occurrences; } } 
    public string URL { get { return this.url; } } 
    public string Keyword { get { return this.keyword; } } 

    public void IncrementOccurrencies() 
    { 
     this.occurrences++; 
    } 

} 
Questions connexes