Есть тхт, в нем, к примеру такие строки:
uygfhquiewna
gh
iuuu
qfq
p932hg9ehijf
oii
pjjw
pjjw
oifji23r3233
fwueg
gh
9238uqu33fgu
Далее...я ввел с клавиатуры строку Console.ReadLine();
gh
, после энтера, надо чтобы софт показал интервалы (если их больше чем один), в которых находится то, что я ввел с клавиатуры, в данном случае, он должен вывести, будет так:
uygfhquiewna
p932hg9ehijf
oifji23r3233
9238uqu33fgu
если же строки, которые находятся в "интервалах" совпадают, то их удалить,типа ".Distinct();
" пока не могу решить эту задачу..
p932hg9ehijf
oii
pjjw
pjjw эта строка совпадает с предыдущей, значит ее удалить..
Класс, представляющий интервал:
class Interval
{
public string StartBound { get; set; }
public string EndBound { get; set; }
public List<string> Content { get; } = new List<string>();
}
Вспомогательная функция, определяющая является ли строка границей интервала:
static bool IsBound(string s) => s.Length >= 12;
Метод для парсинга интервалов из набора строк:
static IEnumerable<Interval> Parse(IEnumerable<string> lines)
{
List<Interval> intervals = new List<Interval>();
Interval curInterval = null;
foreach (string line in lines)
{
if (IsBound(line))
{
if (curInterval != null)
{
curInterval.EndBound = line;
intervals.Add(curInterval);
}
curInterval = new Interval { StartBound = line };
}
else
{
if (curInterval != null)
{
curInterval.Content.Add(line);
}
}
}
return intervals;
}
Код, решающий поставленную задачу:
static void Main()
{
// Здесь вы читаете свои строки из файла
IEnumerable<string> lines = ReadLines();
// Разбиваем на интервалы
IEnumerable<Interval> intervals = Parse(lines);
// Ввод строки для поиска
string s = Console.ReadLine();
// Выбор подходящих интервалов
List<Interval> suitIntervals = intervals.Where(i => i.Content.Contains(s)).ToList();
// Вывод границ интервалов
foreach (Interval interval in suitIntervals)
Console.WriteLine(interval.StartBound + "\n" + interval.EndBound);
Console.ReadLine();
}
Модификация метода для парсинга строк в интервалы без формирования промежуточного списка:
static IEnumerable<Interval> Parse(IEnumerable<string> lines)
{
Interval curInterval = null;
foreach (string line in lines)
{
if (IsBound(line))
{
if (curInterval != null)
{
curInterval.EndBound = line;
yield return curInterval;
}
curInterval = new Interval { StartBound = line };
}
else
{
if (curInterval != null)
{
curInterval.Content.Add(line);
}
}
}
}
Вариант, без перечислений и коллекций...
class Program
{
enum Interval { begin, end, none };
static void Main(string[] args)
{
string[] lines = File.ReadAllLines(@"C:\Users\Unknown\Desktop\text.txt");
string s_in = Console.ReadLine();
string begin_i = null, end_i = null;
Interval i = Interval.none;
foreach (string s in lines)
{
if (s.Equals(s_in) && i == Interval.begin)
{ // строка найдена и начало интервала есть
if(begin_i != end_i)
WriteLine($"{begin_i}");
i = Interval.end;
continue;
}
if (s.Length >= 12) // строка разделитель
{
switch (i)
{
case Interval.none: // фиксируем(изменяем) начало интервала
begin_i = s;
i = Interval.begin;
break;
case Interval.end: // выводим конец интервала
end_i = s;
WriteLine($"{end_i}");
begin_i = s; // конец интервала, возможно станет началом интервала
i = Interval.begin;
break;
}
}
}
ReadLine();
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Небходимо заполнять файл Excel определенными даннымиШирина столбцов должна быть фиксированной, а высота строки увеличиваться в зависимости...
Пишу простые крестики-нолики, чтобы протестить алгоритм МинимаксИдея такая : в xaml создаю обычный Canvas размером примерно 3/4 окна, в нем рисую...