列表返回类型方法仅返回单个Item(最后一个来自List)C#.net

时间:2019-01-05 13:03:40

标签: c# dictionary foreach

我正尝试从列表中获取有序记录,如下所示:

 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) });

         }

它仅将最后一条记录添加到列表中,而我要求将所有记录作为有序记录添加到列表中。因此,我应该如何修改代码以返回列表中的所有建议。我调试了代码,发现这行代码有问题。

1 个答案:

答案 0 :(得分:0)

首先,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"];  
    }