Рейтинг:
9
Maciej Los
Решение Linq:
string[] words = text.ToLower() //needed!
.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);
var result = words
.GroupBy(x=>x)
.Select(grp=> new
{
word = grp.Key,
count = grp.Count()
})
.OrderByDescending(o=>o.count)
.ToList();
foreach(var o in result)
{
Console.WriteLine("{0} - {1}", o.word, o.count);
}
[РЕДАКТИРОВАТЬ]
Не LINQ для решения:
//declare file name
string filename = @"fullfilenamehere";
//grab text from file to string array
string[] lines = File.ReadAllLines(filename);
//create a dictionary, which will hold word and number of occurencies of that word
Dictionary<string, int> listofwords = new Dictionary<string, int>();
//for each line
foreach(string line in lines)
{
//split line into words
string[] words = line.ToLower().Split(new char[] { '.', '?', '!', ' ', ';', ':', ',', '-' }, StringSplitOptions.RemoveEmptyEntries);
//for each word
foreach(string word in words)
if(!listofwords.ContainsKey(word)) //if word does not exists on listofwords
listofwords.Add(word, 1); //add word and set no. of occurencies to 1
else
listofwords[word] += 1; //increase no. of occurencies
}
//display result
Console.WriteLine("Word - No. of occurencies");
foreach(KeyValuePair<string, int> kvp in listofwords)
{
Console.WriteLine("{0} - {1}", kvp.Key, kvp.Value);
}
Richard Deeming
Вы можете избежать необходимости в ToLower
призыв прохождение StringComparer.OrdinalIgnoreCase
к GroupBy
метод.
Maciej Los
Да, это еще один вариант.
- Спасибо, Ричард.
HamzaMcBob
да , это красивый код , как буквально это удивительно, но его настолько высокий уровень, что мне трудно понять и добавить к нему, возможно ли это, если бы вы могли объяснить его мне, вы видите, что я хочу создать его так, чтобы он мог сравнить 2 набора текста и сказать, в каком из них больше вхождений слова. но один из текстов будет в среднем состоять из сотен текстов как в я сравниваю 1 текстовый файл чтобы увидеть сколько вхождений каждого слова существует в нем в среднем сколько слов существует в 100 текстовом файле
Maciej Los
Ну а создание приложения, которое сможет читать более 100 текстовых файлов и создавать статистику для каждого из них и итоговый отчет, - это не тривиальная работа. Вам понадобится база данных или, по крайней мере, набор данных (без базы данных). Это делает вашу программу более сложной. Если вы новичок, я бы посоветовал начать с одного файла. Я улучшу свой ответ, чтобы показать вам не LINQ-решение. Было бы легче понять, что делает код... Хорошо?
HamzaMcBob
это имеет гораздо больше смысла , о мое изумление, ты абсолютный гений.
Maciej Los
:)
Спасибо. Я не гений. Ну, практика делает совершенным.
Рейтинг:
2
OriginalGriff
Простое решение: разбейте каждое слово на отдельные строки, затем либо отсортируйте их и сравните соседние слова, либо используйте Linq GroupBy, чтобы "собрать их вместе", а ToDictionary-чтобы создать коллекцию word + Count.
Красиво и просто в обоих направлениях, в зависимости от вашего уровня опыта.