HamzaMcBob Ответов: 2

Как сделать этот код таким, чтобы он давал количество вхождений каждого слова в тексте на языке Си#


поэтому я нашел какой-то код из

[^]
это практически просто берет слово и говорит вам, сколько раз оно появляется в тексте, но я хочу сделать его для каждого отдельного слова в тексте.

Что я уже пробовал:

Я пробовал использовать функциональность foreach, и она, похоже, не работает, если что-то из-за этого было "0 вхождений" каждого слова.

2 Ответов

Рейтинг:
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.
Красиво и просто в обоих направлениях, в зависимости от вашего уровня опыта.