Прежде всего 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"];
}