Может быть хорошей идеей написать вспомогательный класс для представления ваших данных. Например:
public class PrefixedNumber
{
private static Regex parser = new Regex(@"^(\p{L}+)(\d+)$");
public PrefixedNumber(string source) // you may want a static Parse method.
{
Match parsed = parser.Match(source); // think about an error here when it doesn't match
Prefix = parsed.Groups[1].Value;
Index = parsed.Groups[2].Value;
}
public string Prefix { get; set; }
public string Index { get; set; }
}
Вам, конечно, нужно придумать лучшее имя и лучшие модификаторы доступа.
Теперь задача довольно проста:
List<string> data = new List<string> { "abc001", "abc002", "abc003", "cdef001",
"cdef002", "cdef004", "ghi002", "ghi001" };
var groups = data.Select(str => new PrefixedNumber(str))
.GroupBy(prefixed => prefixed.Prefix);
Результатом являются все данные, проанализированные и сгруппированные по префиксу.