Сортировка элементов словаря - 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 + ".";
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы