/**
         * Utility method to extract item ids that are shared between user A and user B.
         */
        public static int[] getSharedItems(GeneralUser x, GeneralUser y)
        {
            List <int> sharedItems = new List <int>();

            x.getAllRatings().ForEach(delegate(GeneralRating r)
            {
                if (y.getItemRating(r.getItemId()) != null)
                {
                    sharedItems.Add(r.getItemId());
                }
            });
            return(sharedItems.ToArray());
        }
        public double getSimilarity(GeneralUser u, int simType)
        {
            double sim         = 0.0d;
            int    commonItems = 0;

            switch (simType)
            {
            // 0 - вычисление Евклидова расстояния
            case 0:
                foreach (KeyValuePair <int, GeneralRating> kvp in this.DictionaryOfBooksRating)
                {
                    foreach (KeyValuePair <int, GeneralRating> kvp2 in u.DictionaryOfBooksRating)
                    {
                        if (kvp.Value.getItemId() == kvp2.Value.getItemId())
                        {
                            commonItems++;
                            sim += Math.Pow((kvp.Value.getRating() - kvp2.Value.getRating()), 2);
                        }
                    }
                }

                if (commonItems > 0)
                {
                    // Вычисление среднеквадратичной ошибки
                    sim = Math.Sqrt(sim / commonItems);
                    // Значение должно быть от 0 до 1
                    // Если значение 0, значит пользователи абсолютно разные
                    // Если значени 1, значит интрересы пользоватeлей идентичны
                    sim = 1.0d - Math.Tanh(sim);
                }
                break;

            // 1 - вычисление Евклидова расстояния принимая во внмание кол-во общих элементов
            case 1:
                foreach (KeyValuePair <int, GeneralRating> kvp in this.DictionaryOfBooksRating)
                {
                    foreach (KeyValuePair <int, GeneralRating> kvp2 in u.DictionaryOfBooksRating)
                    {
                        if (kvp.Value.getItemId() == kvp2.Value.getItemId())
                        {
                            commonItems++;
                            sim += Math.Pow((kvp.Value.getRating() - kvp2.Value.getRating()), 2);
                        }
                    }
                }

                if (commonItems > 0)
                {
                    sim = Math.Sqrt(sim / commonItems);
                    sim = 1.0d - Math.Tanh(sim);

                    // Максимальное кол-во элементов, которые общие для обоих пользователей
                    int maxCommonItems = Math.Min(this.DictionaryOfBooksRating.Count, u.DictionaryOfBooksRating.Count);
                    sim = sim * ((double)commonItems / (double)maxCommonItems);
                }
                break;

            default: break;
            }
            return(sim);
        }
 public SimilarUser(GeneralUser user, double similarity)
 {
     friend          = user;
     this.similarity = similarity;
 }