Поставлена задача, удалить дубликаты слов(не учитывая регистр,Мама и мама одинаковое слово) двух рассказов. Проблема заключается в том что некоторые слова он не удаляет.Например те, где первое стоит в конце продолжения а, дубликат в начале.
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);
}
//Вывод:
//много
//котов
//собак
//и
//птичек
//во
//дворе
//не
//попугаев
//в
//доме
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Недавно столкнулся с проблемой пересечения нескольких Scroll Rect'овК сожалению, ответа на данном сайте и его западном брате не получил
Мне нужно посчитать число 2 в степени (p-1)/q и найти остаток деления результата на p, где p имеет размерность 1024 бита, а q 128, тип данных чисел - BigIntegerЯ...
Есть метод переопределения, который вытаскивает последние n-элементов спискаДопустим списке у меня 10 элементов, а хочу я получить 100 элементов
Теоретический вопросЕсли нам нужно синхронизировать потоки, то в большинстве случаев наверное достаточно lock, это почти то же самое, что...