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