Сортировка элементов словаря - C#
Формулировка задачи:
Пишу приложение для создания реферата для коллекции документов. Приложение работает, но отобранные предложения в реферате для связности текста надо бы отсортировать в порядке их следования в коллекции документов. Проблема в том, что у меня не получается отлавливать позицию того или иного предложения в словаре с тем, чтобы вывести предложения, опираясь на эти позиции. Может быть это как-то не через словарь можно сделать, но я пока не могу придумать как. Помогите, кто чем может
Вот кусок кода:
int SentencesCount = 0; //..парсинг текста //..подсчёт частотности слов Dictionary<string, double> Sfreq = new Dictionary<string, double>(); //словарь весов предложений M: { } //..Подсчёт весов предложения //составление реферта на основе полученных весов предложений foreach (var pair in Sfreq.OrderByDescending(pair => pair.Value)) //сортировка по весам { if (SentencesCount > 5) //ограничение на количество предложений в реферате break; textBox2.Text += pair.Key + "."; SentencesCount++; //...Пересчет вероятностей слов из предложения, добавленного в реферат... } goto M;
Решение задачи: «Сортировка элементов словаря»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Net; using System.Linq; using System.Text.RegularExpressions; namespace ConsoleApplication175 { class Program { static List<Sentence> Sentences; static void Main(string[] args) { //загружаем текст, парсим предложения var i = 0; var text = new WebClient().DownloadString("http://www.univer.omsk.su/foreign/fom/his_imp.txt"); Sentences = text.Split('.').Select(s => new Sentence(i++, s.Trim())).ToList(); //считаем частоту слов var freq = new Dictionary<string, int>(); foreach (var sentence in Sentences) foreach (var word in sentence) { var w = word.ToLower(); if (freq.ContainsKey(w)) freq[w]++; else freq[w] = 1; } //считаем вес предлжений foreach (var sentence in Sentences) foreach (var word in sentence) sentence.Weight += freq[word.ToLower()]; //сортируем по весу, отбираем пять и затем сортируем по индексу var result = Sentences.OrderBy(s => -s.Weight).Take(5).OrderBy(s => s.Index); //выводим foreach (var s in result) Console.WriteLine(s); Console.ReadLine(); } } class Sentence : IEnumerable<string> { public string Text; public double Weight; public int Index; public Sentence(int index, string text) { this.Index = index; this.Text = text; } public IEnumerator<string> GetEnumerator() { foreach (var word in Regex.Matches(Text, @"\w+").Cast<Match>().Select(m => m.Value)) yield return word; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } public override string ToString() { return Text + "."; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д