Você pode usar expressões regulares para esse fim, mas é bom evitar exceções extras quando a string de entrada não corresponder à expressão regular.
Primeiro, para evitar dores de cabeça extras ao escapar para o padrão regex - poderíamos simplesmente usar a função para esse fim:
String reStrEnding = Regex.Escape("-");
Eu sei que isso não faz nada - como "-" é o mesmo que Regex.Escape("=") == "=", mas fará diferença, por exemplo, se o personagem é @"\".
Então, precisamos corresponder do início da string ao final da string ou, alternativamente, se o final não for encontrado - não corresponda a nada. (String vazia)
Regex re = new Regex("^(.*?)" + reStrEnding);
Se o seu aplicativo for crítico em termos de desempenho - separe uma linha para o novo Regex, se não estiver - você poderá ter tudo em uma linha.
E, finalmente, combine com a sequência e extraia o padrão correspondente:
String matched = re.Match(str).Groups[1].ToString();
Depois disso, você pode escrever uma função separada, como foi feita em outra resposta, ou escrever uma função lambda embutida. Eu escrevi agora usando ambas as notações - função lambda inline (não permite parâmetro padrão) ou chamada de função separada.
using System;
using System.Text.RegularExpressions;
static class Helper
{
public static string GetUntilOrEmpty(this string text, string stopAt = "-")
{
return new Regex("^(.*?)" + Regex.Escape(stopAt)).Match(text).Groups[1].Value;
}
}
class Program
{
static void Main(string[] args)
{
Regex re = new Regex("^(.*?)-");
Func<String, String> untilSlash = (s) => { return re.Match(s).Groups[1].ToString(); };
Console.WriteLine(untilSlash("223232-1.jpg"));
Console.WriteLine(untilSlash("443-2.jpg"));
Console.WriteLine(untilSlash("34443553-5.jpg"));
Console.WriteLine(untilSlash("noEnding(will result in empty string)"));
Console.WriteLine(untilSlash(""));
// Throws exception: Console.WriteLine(untilSlash(null));
Console.WriteLine("443-2.jpg".GetUntilOrEmpty());
}
}
Btw - alterar o padrão regex para "^(.*?)(-|$)"permitirá pegar até o "-"padrão ou se o padrão não foi encontrado - pegar tudo até o final da string.