c# - 列表返回类型方法仅返回单个项目(列表中的最后一个)C#.net
问题描述
我正在尝试从列表中获取有序记录,如下所示:
static Dictionary<string, List<Recomdendations>> productRecomdendationss = new Dictionary<string, List<Recomdendations>>();
public List<Recomdendations> TopMatches(int id)
{
var name = db.Books.SingleOrDefault(x=>x.Id==id).BkName;
List<Recomdendations> books = LoadBooks().ToList();
productRecomdendationss.Add(name,books);
// grab of list of products that *excludes* the item we're searching for
var sortedList = productRecomdendationss.Where(x => x.Key != name);
sortedList.OrderByDescending(x => x.Key);
List<Recomdendations> Recomdendationss = new List<Recomdendations>();
// go through the list and calculate the Pearson score for each product
foreach (var entry in sortedList)
{
Recomdendationss.Add(new Recomdendations() { bookName =entry.Key , Rate = CalculatePearsonCorrelation(name, entry.Key) });
}
return Recomdendationss.OrderByDescending(x=> x.Rate).ToList();
}
当我尝试在以下几行中将记录添加到列表时,就会出现问题:
foreach (var entry in sortedList)
{
Recomdendationss.Add(new Recomdendations() { bookName =entry.Key , Rate = CalculatePearsonCorrelation(name, entry.Key) });
}
它仅将最后一条记录添加到列表中,而我要求将所有记录作为有序记录添加到列表中。那么我应该如何修改代码以返回列表中的所有建议。我调试了代码,发现这行代码有问题。
解决方案
首先productRecomdendationss
是一个包含元组值的字典(string, List<Recomdendations>)
。通过productRecomdendationss.Add(name,books);
将一个元组值添加到字典中,这是可以的。
var sortedList = productRecomdendationss.Where(x => x.Key != name); sortedList.OrderByDescending(x => x.Key);
使用上面的代码,你试图得到一个列表而productRecomdendationss
不是列表,它是一个单项变量字典。让我们假设 where 子句没问题,它返回了你的books
列表。
在此之后,您再次错过sortedList
了字典这一点,我想您仍然认为它是一个列表并 foreach 到该变量上。而且,这也是您将单个项目添加到返回列表的原因。
// sortedList already holds a dictionary and its count 1
foreach (var entry in sortedList)
{
Recomdendationss.Add(new Recomdendations() { bookName =entry.Key , Rate = CalculatePearsonCorrelation(name, entry.Key) });
}
为了实现您所描述的,您应该访问列表,bool productRecomdendationss.TryGetValue("key", out sortedList))
然后循环遍历其元素。希望这种方法可以解决您的问题。
编辑:
要正确使用 TryGetValue(),您可以使用 if/else,如下所示。
// Correct key will return true and
//you can loop over the returned List<Recomdendations>
if (productRecomdendationss.TryGetValue("key", out listOfRec))
{
//if true, listofRec will hold data from the dictionary.
foreach (var entry in listOfRec)
{
//do your thing
}
}else
{
//Data with inquired key is not found
}
此外,您可以像这样从您的词典中获取价值。
// Check whether Dictionary contains data with this key.
if (dictionary.ContainsKey("key"))
{
var value = dictionary["key"];
}
推荐阅读
- javascript - 如何在不使用硬编码字符串的情况下传递 javascript 属性(名称)?
- php - 可以在 Cakephp 模型的表格方法中执行保存操作吗?
- sql - SQL Server - 如何将带有组小计的列添加到查询结果中
- r - R根据以前的列改变新列并动态命名它们
- swift - Swift:在自动布局中保留浮点小数
- unity3d - How to "bake" NavMesh from script at runtime?
- ios - Realm model contains property but not found it at runtime
- ruby-on-rails - Rails Engine migrate_data 没有将数据复制到新的翻译表
- reactjs - React:使用 props 更改更新状态 - handleChange 和 getDerivedStateFromProps
- c# - MSchart 极坐标图自定义标签不起作用