【问题标题】:List return type method returns only a single Item (last from List) C#.net列表返回类型方法仅返回单个项目(列表中的最后一个)C#.net
【发布时间】:2019-01-05 13:03:39
【问题描述】:

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

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

         }

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

【问题讨论】:

  • sortedList.OrderByDescending(x =&gt; x.Key) 不会改变 sortedList - 它只是返回一个有序序列,然后您将忽略它。我怀疑你想要var sortedList = productRecomdendationss.Where(x =&gt; x.Key != name).OrderByDescending(x =&gt; x.Key);
  • 代码按预期工作。这意味着您不了解一些基本概念,但您需要了解它们才能提出正确的问题 - 或者至少知道您不知道什么,以便您可以指出您的问题方向。我将此标记为关闭。

标签: c# dictionary foreach


【解决方案1】:

首先productRecomdendationss 是一个字典,它保存了元组值(string, List&lt;Recomdendations&gt;)。通过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"];  
    }

【讨论】:

  • 不起作用 TryGetValue 返回一个布尔值,而 sortedlist 也是一个字典变量
  • 是的,TryGetValue 返回布尔值,该值指示是否通过键找到值。但是,如果键正确并且 TryGetValue 返回 true,则 sortedList 不可能是字典。
  • 现在代码运行良好,但是当我在运行时传递第一个参数,然后传递 1 和 2 和 3 等时,它返回 0 结果。此外,如果我两次传递相同的参数 (id),则表示密钥已经传递。我希望它在我第一次传递 id 时返回所有结果。
  • 所以我想这是关于正确地从 dB 获得结果。如果这有助于您了解问题所在,请接受我的回答,以便其他人可以看到如何处理类似问题。
  • 它是关于从 db 中获取结果,然后根据 score (Rating) 对它们进行排序,推荐类负责处理临时结果。我只想要代码应该返回一个推荐列表,就像我在 Recommendations.add 方法中所做的那样。但它不是 list 它返回一个单例值。我接受这个答案,但我没有得到想要的行为。
猜你喜欢
  • 2021-07-30
  • 2019-07-08
  • 2019-08-26
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多