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

#c# #list #listbox

#c# #Список #listbox

Вопрос:

У меня есть 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  
  

Комментарии:

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

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

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

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

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

Ответ №1:

Я бы использовал a 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);
        }
    }
}
  

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

Комментарии:

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

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

Ответ №2:

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

 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]}";    
}
  

Ответ №3:

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

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