Разделение строк некоторым текстом в списке

У меня есть ListBox, где имена таблиц записываются так:

Staging_Section_01_2019_03_19_01  
Staging_Section_01_2019_03_20_01  
Staging_Section_23_2019_03_21_01  
Staging_Section_52_2019_03_23_01  
Staging_Section_52_2019_03_24_01  

Что я пытаюсь сделать, так это разделить их по номеру раздела, поэтому я хочу, чтобы все Section_01 в одном List объекте и Section_23 в другом List объекте, и так далее, и тому подобное. Динамический характер - вот что усложняет мне жизнь.

Пока что у меня есть следующее:

foreach (var it in uploadBox.Items)
{
    if (it.ToString().Contains("Section"))
    {
        section = it.ToString().Substring(0, 18);
        found = it.ToString().IndexOf("_");
        section = section.Substring(found + 1);
        sectionNum = section.Substring(8, 2);
    }
}

Я получил sectionNum, который будет просто номером и разделом, то есть строкой, похожей на Section_01.

Любая идея о том, как подойти к этому?

Ожидаемый результат будет примерно таким:

Список 1

Staging_Section_01_2019_03_19_01  
Staging_Section_01_2019_03_20_01  

Список 2

Staging_Section_23_2019_03_21_01  

Список 3

Staging_Section_52_2019_03_23_01  
Staging_Section_52_2019_03_24_01  

Это отлично подходит для регулярных выражений.

Lews Therin 10.04.2019 21:50

Я думаю, что вопрос оператора заключается в том, как разместить их в отдельных списках по их количеству.

Charles May 10.04.2019 21:54

Пожалуйста, покажите нам пример того, каков ваш ожидаемый результат

Steve 10.04.2019 21:55

И возможно ли иметь Section_100 или Section_1000?

Steve 10.04.2019 22:01

это всегда Staging_Section_##?. Если это так, просто сохраните текущий и в следующем цикле, если эта подстрока не совпадает с сохраненной, создайте новый список и добавьте текущий. Каждый раз сохраняя, чтобы убедиться, что вы сравниваете предыдущий для разнообразия.

Charles May 10.04.2019 22:02

@ Стив, нет, он останется ниже 100 разделов.

SQLserving 10.04.2019 22:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я бы использовал Dictionary<string, List<string>> для этого. Каждый анализируемый «раздел» будет ключом, а оставшаяся часть будет значением.

Dictionary<string, List<string>> myDict = new Dictionary<string, List<string>>();
foreach (var it in uploadBox.Items)
{
    if (it.ToString().Contains("Section"))
    {
        section = it.ToString().Substring(0, 18);
        found = it.ToString().IndexOf("_");
        section = section.Substring(found + 1);
        sectionNum = section.Substring(8, 2);

        if (!myDict.ContainsKey(sectionNum))
        {
            myDict.Add(sectionNum, new List<string> { someOtherValue });
        }
        else
        {
            myDict[sectionNum].Add(someOtherValue);
        }
    }
}

Если я полностью неправильно истолковал ваш вопрос, я думаю, что это потенциальное решение для ваших динамических объектов.

Эта подстрока (0,18) будет проблемой, если у нас есть ...Раздел_100...

Steve 10.04.2019 22:00

Я согласен. Я бы рекомендовал разделить на «_» и просто соединить индексы 1 и 2.

Ingenioushax 10.04.2019 22:39

вы можете сделать что-то вроде этого:

var sections = new Dictionary<string, List<string>>();

foreach(var it in uploadBox.Items)
{
    var item = it.ToString();

    if (item.Contains("Section"))
    {

        var section = GetSection(item);

        if (!sections.ContainsKey(section))
        {
            sections.Add(section, new List<string>());            
        } 

        sections[section].Add(item);
    }    
}

private string GetSection(string item)
{
    var split = item.Split("_");
    return $"{split[1]}_{split[2]}";    
}

Лучше всего использовать регулярное выражение для такого рода задач:

uploadBox.Items
    .GroupBy(x => Regex.Match(x.ToString(), @"^\w+_Section_(?<section>\d+)").Groups["section"].Value)

Другие вопросы по теме