首页 > 解决方案 > 列表返回类型方法仅返回单个项目(列表中的最后一个)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) });

         }

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

标签: c#dictionaryforeach

解决方案


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

推荐阅读