У меня есть 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.
Любая идея о том, как подойти к этому?
Ожидаемый результат будет примерно таким:
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_100 или Section_1000?
это всегда Staging_Section_##?. Если это так, просто сохраните текущий и в следующем цикле, если эта подстрока не совпадает с сохраненной, создайте новый список и добавьте текущий. Каждый раз сохраняя, чтобы убедиться, что вы сравниваете предыдущий для разнообразия.
@ Стив, нет, он останется ниже 100 разделов.





Я бы использовал 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...
Я согласен. Я бы рекомендовал разделить на «_» и просто соединить индексы 1 и 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]}";
}
Лучше всего использовать регулярное выражение для такого рода задач:
uploadBox.Items
.GroupBy(x => Regex.Match(x.ToString(), @"^\w+_Section_(?<section>\d+)").Groups["section"].Value)
Это отлично подходит для регулярных выражений.