#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)