Поставлена задача, удалить дубликаты слов(не учитывая регистр,Мама и мама одинаковое слово) двух рассказов. Проблема заключается в том что некоторые слова он не удаляет.Например те, где первое стоит в конце продолжения а, дубликат в начале.
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace WordCount
{
class Program
{
public static void EditorText(string a)
{
var newText = Regex.Replace(a, "[\"-.?!)(,:]", "");
newText = string.Join(" ", newText.Split(' ').Distinct());
using (var sw = File.AppendText(@"\p.txt"))
{
sw.Write(newText);
}
}
public static void Main(string[] args)
{
StreamReader sr = new StreamReader(@"test\o.txt", Encoding.Default);
var test = sr.ReadToEnd();
StreamReader se = new StreamReader(@"\test\t.txt", Encoding.Default);
var test2 = se.ReadToEnd();
var test3 = test + test2;
EditorText(test3);
}
}
}
Можно пойти таким путем:
Допустим есть файлы 1.txt, 2.txt и 3.txt. В будущем к примеру могут добавиться еще, значит мы можем сразу написать метод, который будет принимать массив файлов и их обрабатывать.
Создадим этот метод:
На вход он пусть принимает массив, а выходом будет одна строка со всеми уникальными словами.
public static string Check(params string[] files)
{
var text = files.Where(File.Exists)
.SelectMany(x => File.ReadAllText(x).Split())
.Select(x => new string(x.Where(char.IsLetterOrDigit).ToArray()))
.Where(x => !string.IsNullOrWhiteSpace(x))
.Distinct(StringComparer.CurrentCultureIgnoreCase);
return string.Join(" ", text);
}
Поясню что тут и как:
files.Where(File.Exists) - файлы, которые отсутствуют нам не подходят, поэтому мы смело берем только те, которые существую на диске..SelectMany(x => File.ReadAllText(x).Split()) - Читаем каждый файл и разбиваем текст по пробелу (заметьте, не обязательно ставить символ для разбития, если нам необходимо разбить по пробелу. Метод Split это делает по умолчанию!). На этом этапе у нас будет массив слов всех файлов..Select(x => new string(x.Where(char.IsLetterOrDigit).ToArray())) - Удаляем все лишние символы (кроме цифр и букв)..Where(x => !string.IsNullOrWhiteSpace(x)) - чистим все от пустых строк (если есть)..Distinct(StringComparer.CurrentCultureIgnoreCase); - Сверяем все слова и убираем те, что повторяются (CurrentCultureIgnoreCase здесь именно игнорирование регистра).return string.Join(" ", text); - собираем строку из массива, разбивая слова пробелом и возвращаем ее.Вызываем полученный метод:
Здесь мы вызываем наш метод Check, которому передаем все необходимые файлы для сравнения и результат выводим для примера в консоль.
Console.WriteLine(Check("1.txt","2.txt","3.txt"));
Для примера давайте заполним три файла некими данными:
1 2 3 4 5 6 7 8 9 0
1 2 7 9 12 63 84 3 78 677
абв вба 1сс, qw/!2g - прр2
Запускаем и смотрим на результат:
1 2 3 4 5 6 7 8 9 0 12 63 84 78 677 абв вба 1сс qw2g прр2
Все значения у нас уникальны и текст подчищен (можно сравнить qw/!2g с результатом).
Удачи в изучении C#!
Проверьте, с моим примером сработало. Нужны будут правки, напишите в комментарии. Вот код:
string [] text1 = "Много котов собак и птичек во дворе".Split(' ');
string [] text2 = "Не много котов собак и попугаев в доме".Split(' ');
HashSet<string> vs = new HashSet<string>();
var a = text1.Concat(text2);
foreach (var item in a)
{
vs.Add(item.ToLower());
}
foreach (var item in vs)
{
Console.WriteLine(item);
}
//Вывод:
//много
//котов
//собак
//и
//птичек
//во
//дворе
//не
//попугаев
//в
//доме
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости