public Dictionary <string, string> GetStatistics() { if (_statistics != null) { return(_statistics); } Logger.Current.Info("Calculating dataContainer '{0}' statistics...", Id); _statistics = new Dictionary <string, string>(); long matrixCount = (long)Users.Count * Items.Count; double sparsity = (double)100L * (matrixCount - Feedbacks.Count) / matrixCount; var users = new Dictionary <string, int>(); var items = new Dictionary <string, int>(); foreach (Feedback f in Feedbacks) { string userId = f.User.Id; string itemId = f.Item.Id; if (!users.ContainsKey(userId)) { users[userId] = 1; } else { users[userId]++; } if (!items.ContainsKey(itemId)) { items[itemId] = 1; } else { items[itemId]++; } } var feedbackAttrs = Feedbacks.First().Attributes.Values.Select(a => a.Name).Distinct().ToList(); var userAttrs = Feedbacks.First().User.Attributes.Values.Select(a => a.Name).Distinct().ToList(); var itemAttrs = Feedbacks.First().Item.Attributes.Values.Select(a => a.Name).Distinct().ToList(); _statistics.Add("containerId", Id); _statistics.Add("feedbacks", Feedbacks.Count.ToString()); _statistics.Add("users", Users.Count.ToString()); _statistics.Add("items", Items.Count.ToString()); _statistics.Add("sparsity", string.Format("{0:0.00}", sparsity)); _statistics.Add("usrMinFb", users.Values.Min().ToString()); _statistics.Add("usrMaxFb", users.Values.Max().ToString()); _statistics.Add("usrAvgFb", string.Format("{0:0.00}", users.Values.Average())); _statistics.Add("itmMinFb", items.Values.Min().ToString()); _statistics.Add("itmMaxFb", items.Values.Max().ToString()); _statistics.Add("itmAvgFb", string.Format("{0:0.00}", items.Values.Average())); _statistics.Add("allFeedbackAttrs", feedbackAttrs.Count > 0 ? feedbackAttrs.Aggregate((a, b) => a + "|" + b) : "NA"); _statistics.Add("allUserAttrs", userAttrs.Count > 0 ? userAttrs.Aggregate((a, b) => a + "|" + b) : "NA"); _statistics.Add("allItemAttrs", itemAttrs.Count > 0 ? itemAttrs.Aggregate((a, b) => a + "|" + b) : "NA"); return(_statistics); }