views:

207

answers:

3

I have a class Referrals. When you create an object in the class, it checks that the input strings are unique (and therefore never allows duplicate objects). But when I find that input string str1 is equal to that of a previously created object, instead of creating a new object or just returning false, i want to change a property of the already created object. But i can't figure out how to do this, as the method has no way of knowing the name of the object. But I know something unique about it! I feel like this must be enough to somehow call it, and do what I need to do.

Any ideas?
THANKS!

Here is the class:

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++;
    }

    }

        }
    }
A: 

Why don't you create a List of Referral objects outside of the Referral object itself? That way you can check the List to see if the object with your criteria already exists. If so, update that object. If not, create a new one and add it to the list.

Either that or use a static list, also declared outside of the Referrals class.

I'm not 100% sure where you're going with this, so hopefully one of those approaches will work for you.

scottmarlowe
Why outside the Referral class? If the only place it's used is in the Referral constructor, there's no reason to expose it outside the class.
Tal Pressman
it sounds to me like they're trying to maintain a collection of objects, and want to add new objects when one does not exist and update an existing one when one does exist. A collection of those objects seems like the best way to accomplish this.
scottmarlowe
A: 

Try using the Dictionary.TryGetValue method?

I didn't quite understand what you're attempting to do with your code, and it's a bit late.

Jean Azzopardi
A: 

You need to create a controller class that will maintain a collection of referral objects in order to achieve the prerequisite checking and updating of the object.

Something like:

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;
    }
}

And I would change your Referral class to not take in Occurrences as a variable. This should be handled privately to the object:

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++;
   } 

}
James