Сортировка словаря (строка, 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.