Сортировка словаря (строка, int) по значению
Так что в основном у меня проблема с заданием, которое мне дано. Я не буду утомлять вас подробностями самой задачи, поэтому я просто дам вам соответствующую информацию.
У меня есть словарь, который мне нужно отсортировать по int [value], который является самым высоким, а также лучшим из пяти лучших, и я должен также показать нижнюю пятерку.
Dictionary<string, int> dict = new Dictionary<string, int>();
Строки (ключи) содержат слова, которые были прочитаны для текстового файла. Ints (values) содержат ints, сколько раз они упоминались в документе.
Я собирался сделать это по-другому, но мне сказали сделать это со словарем, поэтому, пожалуйста, помогите только в словах.
Я был бы признателен, если бы вы могли объяснить, как это сделать, чтобы я мог учиться, а также завершить задачу, поскольку целью этой задачи является просвещение, но я нахожу это немного трудным.
Я ценю всю вашу помощь заранее, если требуется дополнительная информация, пожалуйста, дайте мне знать, и я отправлю его!
Ответы
Ответ 1
Словари не имеют неотъемлемого порядка. Но если вы хотите получить 5 лучших записей с наивысшими (или самыми низкими) значениями, вы можете использовать немного Linq:
using System.Linq;
...
var top5 = dict.OrderByDescending(pair => pair.Value).Take(5);
var bottom5 = dict.OrderBy(pair => pair.Value).Take(5);
Это вернет IEnumerable<KeyValuePair<string, int>>
. Чтобы включить его в словарь, снова Linq может помочь. Например:
var top5 = dict.OrderByDescending(pair => pair.Value).Take(5)
.ToDictionary(pair => pair.Key, pair => pair.Value);
Теперь top5
является Dictionary<string, int>
, который содержит только 5 элементов из dict
с самым высоким значением.
Ответ 2
Вам нужно получить упорядоченный результат из вашего словаря, так как вы ищете Top 5, вам понадобится Take
как:
//Top 5
foreach (var item in dict.OrderByDescending(r => r.Value).Take(5))
{
Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}
Причина, по которой вам нужен OrderBy, заключается в следующем:
Dictionary<TKey, TValue> Class
В целях перечисления каждый элемент в словаре рассматривается как структура KeyValuePair, представляющая ценность и ее ключ. Порядок возврата элементов undefined.
Ответ 3
Если вы используете С# 3.0 и выше
Вы можете сделать что-то подобное с помощью LINQ
foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value).Take(5))
{
// do something with item.Key and item.Value
}
Если вы используете С# 2.0
List<KeyValuePair<string, string>> myList = aDictionary.ToList();
myList.Sort((firstPair,nextPair) =>
{
return firstPair.Value.CompareTo(nextPair.Value);
}
);
или его можно переписать как
myList.Sort((x,y)=>x.Value.CompareTo(y.Value));
LINQ
обеспечивает большую гибкость в том, что вы можете выбрать лучшие 10, 20 10% и т.д. Или, если вы используете свой индекс частоты слов для ввода типа вперед, вы также можете включить предложение StartsWith.