public void AddUserActionsToLikes(string userAction)
        {
            List <UserAction> listUserActions = Ratings.Where(s => s.Action.Equals(userAction)).ToList();

            this.Likes.AddRange(listUserActions);

            foreach (UserAction uA in listUserActions)
            {
                RaterBase rater = Raters.FirstOrDefault(s => s.Id == uA.Rater.Id);

                if (rater != null)
                {
                    rater.Likes.Add(uA.Ratee);
                }
            }
        }
        public void RemoveUserActionsFromLikes(string userAction)
        {
            List <UserAction> listUserActions = Ratings.Where(s => s.Action.Equals(userAction)).ToList();

            for (int index = listUserActions.Count() - 1, count = 0; count < listUserActions.Count() - 1; index--, count++)
            {
                this.Likes.RemoveAt(index);
            }

            for (int index = listUserActions.Count() - 1; index >= 0; index--)
            {
                UserAction uA    = listUserActions[index];
                RaterBase  rater = Raters.FirstOrDefault(s => s.Id == uA.Rater.Id);

                if (rater != null)
                {
                    rater.Likes.RemoveAt(rater.Likes.Count() - 1);
                }
            }
        }
        public override void LoadData(string fileName, string actionLike, string actionDislike)
        {
            DateTime now = DateTime.Now;

            System.Console.WriteLine("LoadData() start time:  " + now);

            string[] contents = System.IO.File.ReadAllLines(fileName);

            bool tags = false, article = false, user = false, ratings = false;

            foreach (string content in contents)
            {
                if (content.StartsWith("# Tags"))
                {
                    tags = true;
                    continue;
                }

                if (content.StartsWith("# Articles"))
                {
                    article = true;
                    continue;
                }
                if (content.StartsWith("# Users"))
                {
                    user    = true;
                    article = false;
                    tags    = false;
                    continue;
                }


                if (content.StartsWith("# User actions"))
                {
                    ratings = true;
                    user    = false;
                    article = false;
                    tags    = false;
                    continue;
                }

                if (string.IsNullOrEmpty(content) == true || content.StartsWith("#"))
                {
                    continue;
                }

                string[] splits = content.Split(",");

                if (tags == true)
                {
                    int number = 1;
                    foreach (string split in splits)
                    {
                        Tags.Add(new Tag()
                        {
                            Id = number++, Name = split.Trim()
                        });
                    }

                    tags = false;
                }

                if (article == true)
                {
                    Article ratee = new Article()
                    {
                        Tags      = new List <Tag>(),
                        Name      = splits[1].Trim(),
                        Id        = int.Parse(splits[0]),
                        Likes     = new List <RaterBase>(),
                        Dislikes  = new List <RaterBase>(),
                        Views     = new List <RaterBase>(),
                        Downloads = new List <RaterBase>()
                    };

                    Ratees.Add(ratee);

                    for (int index = 2; index < splits.Count(); index++)
                    {
                        ratee.Tags.Add(this.Tags.FirstOrDefault(s => s.Name == splits[index].Trim()));
                    }
                }

                if (user == true)
                {
                    Raters.Add(new User
                    {
                        Id        = int.Parse(splits[0]),
                        Name      = splits[1].Trim(),
                        Likes     = new List <RateeBase>(),
                        Dislikes  = new List <RateeBase>(),
                        Views     = new List <RateeBase>(),
                        Downloads = new List <RateeBase>()
                    });
                }

                if (ratings == true)
                {
                    UserAction rating = new UserAction
                    {
                        Action = splits[1],
                        Ratee  = this.Ratees.FirstOrDefault(s => s.Name == splits[5].Trim()),
                        Rater  = this.Raters.FirstOrDefault(s => s.Name == splits[3].Trim()),
                    };

                    Ratings.Add(rating);
                    if (rating.Action.Equals(actionLike))
                    {
                        rating.Ratee.Likes.Add(rating.Rater);
                        rating.Rater.Likes.Add(rating.Ratee);
                    }
                    else if (rating.Action.Equals(actionDislike))
                    {
                        rating.Ratee.Dislikes.Add(rating.Rater);
                        rating.Rater.Dislikes.Add(rating.Ratee);
                    }
                    else if (rating.Action.Equals("Download"))
                    {
                        Downloads.Add(rating);
                        ((Article)rating.Ratee).Downloads.Add(rating.Rater);
                        ((User)rating.Rater).Downloads.Add(rating.Ratee);

                        ((Article)rating.Ratee).Likes.Add(rating.Rater);
                        ((User)rating.Rater).Likes.Add(rating.Ratee);
                    }
                    else if (rating.Action.Equals("View"))
                    {
                        Views.Add(rating);
                        ((Article)rating.Ratee).Views.Add(rating.Rater);
                        ((User)rating.Rater).Views.Add(rating.Ratee);
                    }
                }
            }
            System.Console.WriteLine("LoadData() time to process:  " + DateTime.Now.Subtract(now));

            InitializeStatistics("UpVote", "DownVote");
        }