Здравствуйте, хочу советов по решению задачи. После вью на работе дали задание на C# с многопоточностью, работа с файлом
Вот само задание: Задание: Работа со структурами (коллекциями) данных в C#
Описание задачи: требуется реализовать механизм обработки входного произвольного текста. Механизм должен принимать и обрабатывать текст в многопоточном режиме, должен выполнять следующие методы обработки:
- определить все повторяющиеся слова и количество повторений этих слов;
- определить алфавит текста;
- замена порядка слов на обратный.
Выбор метода обработки определяется входным параметром, отправляемым вместе с текстом.
Требования к реализации: должны быть задействованы, максимально возможно, стандартные структуры данных (коллекции), такие как List, Dictionary, Stack, Queue и т. д. Должна быть соблюдена точная синхронизация доступа к данным. Прием и вывод результатов не должен влиять на выполнение метода обработки. Реализация всего механизма должна быть в виде отдельного класса или группы классов, желательно в отдельной сборке.
Тестирование: должно проводиться двумя способами: разовое ручное и автоматический тест в многопоточном режиме с выводом результатов на некотором объёме входных данных.
Три эти метода я за пол ночи написал (хотя до этого c# не изучал, только с++ и java). дальше надо использовать потоки, но я не могу понять как их применить и алгоритм решения задачи не могу ясно представить. Прочитал несколько глав про потоки на https://metanit.com/sharp/tutorial/5.4.php, но это не помогло. Буду рад если подскажете алгоритм решения задачи, или в какую сторону двигаться (я начинающий). Спасибо Код , который я сам написал:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleAppProm
{
class Program
{
//static Mutex mutexObj = new Mutex();
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(CountRepeatWordsInText));
thread1.Start();
Thread thread2 = new Thread(new ThreadStart(FindAlphabet));
thread2.Start();
Thread thread3 = new Thread(new ThreadStart(InverseString));
thread3.Start();
Console.ReadKey(true);
}
public static void CountRepeatWordsInText()
{
string path = @"d:\Tatiana\Documents\task_fromPromis\Задание.txt";
if (path.Equals(null))
{
throw new ArgumentNullException();
}
string line;
if (File.Exists(path))
{
StreamReader file = null;
try
{
file = new StreamReader(path, Encoding.Default);
while ((line = file.ReadToEnd()) != null)
{
string[] words = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
var result = words.GroupBy(x => x)//Группируем слова-элементы массива
.Where(x => x.Count() > 1)//Фильтруем из них только те группы, количество элементов в которых больше 1
.Select(x => new { Word = x.Key, Frequency = x.Count() });//Представляем результаты в виде перечисления анонимного типа
foreach (var item in result)
{
Console.WriteLine("Слово: {0}\tКоличество повторов: {1}", item.Word, item.Frequency);
}
}
}
finally
{
if (file != null)
file.Close();
}
}
}
public static void FindAlphabet()
{
string path = @"d:\Tatiana\Documents\task_fromPromis\Задание.txt";
if (path.Equals(null))
{
throw new ArgumentNullException();
}
var charCount = 0;
using (var reader = new StreamReader(path, detectEncodingFromByteOrderMarks: true))
{
while (reader.Read() > -1)
{
charCount++;
}
}
if (File.Exists(path))
{
StreamReader file = null;
try
{
file = new StreamReader(path, Encoding.Default);
char[] chars = new char[charCount];
while ((chars = file.ReadToEnd().ToCharArray()) != null)
{
var distinct = new List<char>();
var list = new List<char>();
foreach (char ch in chars)
{
if (Char.IsLetter(ch))
list.Add(Char.ToUpper(ch));
list.Sort();
distinct = list.Distinct().ToList();
}
foreach (var dist in distinct)
{
Console.Write(dist + ", ");
}
}
}
finally
{
if (file != null)
file.Close();
}
}
}
public static void InverseString()
{
string path = @"d:\Tatiana\Documents\task_fromPromis\Задание.txt";
if (path.Equals(null))
{
throw new ArgumentNullException();
}
string line;
if (File.Exists(path))
{
StreamReader file = null;
try
{
file = new StreamReader(path, Encoding.Default);
while ((line = file.ReadToEnd()) != null)
{
string[] words = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
for (int i = words.Length - 1; i >= 0; i--)
{
Console.Write(words[i] + " ");
}
}
}
finally
{
if (file != null)
{
file.Close();
}
}
}
}
}
}