我正在使用字典从数据库中获取建议。虽然我是根据Pearson相关评分获得记录的,但是对于每个循环,建议仅从数据库返回一个记录。
我试图将字典值插入到列表中的键上,因为Pearson Formula仅接受与其他产品(值)进行比较的键。但是随着我添加键,数据变得多余。 如果我使用循环并使用数组索引遍历列表(从数据库)。它返回索引超出范围异常。
public List<Recommendations> TopMatches(int id)
{
int Uid = user.GetId();
string bkName = db.Books.SingleOrDefault(x => x.Id == id).BkName;
List<Recommendations> iterator = LoadBooks().ToList();
List<Recommendations> list = new List<Recommendations>();
foreach (var item in iterator)
{
list.Add(item);
}
if (!SuggestedDictionary.ContainsKey(bkName) && !CopyDataDict.ContainsKey(bkName))
{
SuggestedDictionary.Add(bkName, list);
CopyDataDict.Add(bkName, list);
}
//SuggestedDictionary.TryGetValue(name, out books);
// grab of the list of products that *excludes* the item we're searching for
//var sortedList =SuggestedDictionary.Where(x=>x.Key !=bkName);
//sortedList.OrderByDescending(x => x.Key);
List<Recommendations> rec = new List<Recommendations>();
foreach (var key in SuggestedDictionary.Keys)
{
rec.Add(new Recommendations()
{
bookName = key,
Rate = CalculatePearsonCorrelation(bkName, key),
UserId = Uid
});
}
// SuggestedDictionary.Clear();
SuggestedDictionary.Remove(SuggestedDictionary.Keys.ToString());
//list.Remove(SuggestedDictionary.Keys.ToString());
//SuggestedDictionary.Remove(SuggestedDictionary.Values.ToList());
//SuggestedDictionary.Values.Reverse();
/* foreach (var entry in CopyDataDict.Values.ToList())
{
if (!SuggestedDictionary.ContainsKey(entry.bookName))
{
SuggestedDictionary.Add(entry[i].bookName, list);
list.Remove(entry[i]);
}
}*/
return rec.ToList();
}
我至少需要10条建议,我可以使用Take(10)进行限制。但是如何避免数据冗余,以及如何始终获得唯一和多个记录而又没有索引超出异常之类的例外。也请查看注释的代码。