Метод возвращаемого типа списка возвращает только один элемент (последний из списка) C # .net - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь получить заказанные записи из списка следующим образом:

 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 голосов
/ 05 января 2019

Прежде всего 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)), и после этого можно было бы перебирать его элементы. Надеюсь, что этот подход решит вашу проблему.

Edit:

Для правильного использования 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"];  
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...