Отображение строчных интервалов

263
05 июля 2017, 23:42

Есть тхт, в нем, к примеру такие строки:

uygfhquiewna
gh
iuuu
qfq
p932hg9ehijf
oii
pjjw
pjjw
oifji23r3233
fwueg
gh
9238uqu33fgu

Далее...я ввел с клавиатуры строку Console.ReadLine(); gh, после энтера, надо чтобы софт показал интервалы (если их больше чем один), в которых находится то, что я ввел с клавиатуры, в данном случае, он должен вывести, будет так:

uygfhquiewna
p932hg9ehijf
oifji23r3233
9238uqu33fgu

если же строки, которые находятся в "интервалах" совпадают, то их удалить,типа ".Distinct();" пока не могу решить эту задачу..

    p932hg9ehijf
    oii
    pjjw
    pjjw    эта строка совпадает с предыдущей, значит ее удалить..
Answer 1

Класс, представляющий интервал:

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);
            }
        }
    }
}
Answer 2

Вариант, без перечислений и коллекций...

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();
    }
}
READ ALSO
Не отображается View

Не отображается View

Работаю с nopcommerceСоздал Controller, RouteProvider, View

203
Поиск даты в строке

Поиск даты в строке

Входная строка: "0105

191
ClosedXML высота строки

ClosedXML высота строки

Небходимо заполнять файл Excel определенными даннымиШирина столбцов должна быть фиксированной, а высота строки увеличиваться в зависимости...

329
Нарисовать Ellipse в Button

Нарисовать Ellipse в Button

Пишу простые крестики-нолики, чтобы протестить алгоритм МинимаксИдея такая : в xaml создаю обычный Canvas размером примерно 3/4 окна, в нем рисую...

237