Есть строка с именем файла(например string filename= FI_FILE1_111_1111). Как мне вытащить его префикс до второго нижнего подчеркивания(FI_FILE1_)??
Как нибудь наверное через substring и string.indexOf(но если привязаться к "_" то он возьмет только первую часть), либо через Regex
Ну например так:
var s = "FI_FILE1_111_1111";
var firstIndex = s.IndexOf('_');
var secondIndex = s.IndexOf('_', firstIndex + 1);
var part = s.Substring(0, secondIndex + 1);
При отсутствии нужного количества _ выдаст пустую строку.
Менее эффективно, но короче:
var part = string.Concat(s.Split('_').Take(2).Select(p => p + "_"));
При отсутствии нужного количества _ выдаст пустую строку.
Раз уж были упомянуты регулярки:
string filename = "FI_FILE1_111_1111";
string pattern = "^[^_]+_[^_]+_"; // "^.+?_.+?_"
string result = Regex.Match(filename, pattern).Value;
Если важна скорость, самый быстрый вариант
string GetPrefix(string file)
{
int count = 0;
for (var i = 0; i < file.Length; i++)
{
if (file[i] == '_') count++;
if (count == 2) return file.Substring(0, i+1);
}
return string.Empty;
}
Как проверить
Console.WriteLine(GetPrefix("FI_FILE1_111_1111"));
Результат
FI_FILE1_
Еще вариант на Linq:
string s = "FI_FILE1_111_1111";
Console.WriteLine(
Enumerable.Range(1, s.Length)
.Select(x => s.Substring(0, x))
.SkipWhile(ss => ss.Count(c => c == '_') != 2)
.FirstOrDefault());
Берем входную строку, начинаем отрезать от начала один символ, потом два, потом три и т.д., пока не получится строка содержащая ровно два символа _. Если в строке нету двух символов _ — вернется null. Да, это дичайше неэффективно.
Вот вам ещё один вариант с LINQ.
var s = "FI_FILE1_111_1111";
int count = 0;
var part = new string(s.TakeWhile(c => count < 2 && (c != '_' || ++count > -1)).ToArray());
Не пытайтесь повторить это дома в production'е.
Продвижение своими сайтами как стратегия роста и независимости