Во-первых, вы бесполезно анализируете одну и ту же строку снова и снова (оба сопоставляются с регулярным выражением, а затем анализируют совпадения). Вместо этого инкапсулируйте то, что у вас есть, в пользовательский тип, так что вам придется анализировать только один раз.
public class FooString {
private readonly string foo;
private readonly long bar;
public FooString(string foo) {
this.foo = foo;
Match match = Regex.Match(foo, @"\d+$");
this.bar = Int64.Parse(match.Value);
}
public string Foo { get { return this.foo; } }
public long Bar { get { return this.bar; } }
}
Я бы даже добавил Contract.Requires
к этому классу, который говорит, что foo
должен удовлетворять регулярному выражению.
Во-вторых, у вас есть IComparer<T>
, который умирает при определенных значениях T
(в вашем случае, string
с, которые не соответствуют регулярному выражению и не могут быть проанализированы с long
). Это вообще плохая идея.
Итак, сделайте сравнение для FooString
:
public FooStringComparer : IComparer<FooString> {
public int Compare(FooString a, FooString b) {
Contract.Requires(a != null);
Contract.Requires(b != null);
return a.Bar.CompareTo(b.Bar);
}
}
Теперь ваша сортировка будет невероятно быстрой, потому что вы перестали анализировать одну и ту же строку снова и снова.