Я думаю, вы приближаетесь к этому неправильно. Вы не Сортировка строк, вы сортируете структурированные объекты, которые искажены как строки (кто-то метко назвал этот противник "stringly typed"). Ваши требования показывают, что вы знаете эту структуру, но она не представлена в datastructure List<string[]>
, и это усложняет вашу жизнь. Вы должны разобрать эту структуру в реальном типе (struct или class), а затем отсортировать ее.
enum PrefixCode { MW1, FW, DN, MWSTX1CK, MWSTX2FF, }
enum TheseLetters { Q, J, C, E, I, A, }
struct CardRecord : IComparable<CardRecord> {
public readonly PrefixCode Code;
public readonly TheseLetters Letter;
public readonly uint Number;
public CardRecord(string input) {
Code = ParseEnum<PrefixCode>(ref input);
Letter = ParseEnum<TheseLetters>(ref input);
Number = uint.Parse(input);
}
static T ParseEnum<T>(ref string input) { //assumes non-overlapping prefixes
foreach(T val in Enum.GetValues(typeof(T))) {
if(input.StartsWith(val.ToString())) {
input = input.Substring(val.ToString().Length);
return val;
}
}
throw new InvalidOperationException("Failed to parse: "+input);
}
public int CompareTo(CardRecord other) {
var codeCmp = Code.CompareTo(other.Code);
if (codeCmp!=0) return codeCmp;
var letterCmp = Letter.CompareTo(other.Letter);
if (letterCmp!=0) return letterCmp;
return Number.CompareTo(other.Number);
}
public override string ToString() {
return Code.ToString() + Letter + Number.ToString("00");
}
}
Программа, использующая выше, чтобы обработать ваш пример может быть затем:
static class Program {
static void Main() {
var inputStrings = new []{ "MW1E10", "MWSTX2FFI06", "FWQ02", "MW1Q04", "MW1Q05",
"FWI01", "MWSTX2FFA01", "DNC03", "MWSTX1CKC02", "MWSTX2FFI03", "MW1I06" };
var outputStrings = inputStrings
.Select(s => new CardRecord(s))
.OrderBy(c => c)
.Select(c => c.ToString());
Console.WriteLine(string.Join("\n", outputStrings));
}
}
Это порождает тот же порядок, как в вашем примере. В реальном коде я бы рекомендовал вам назвать типы в соответствии с тем, что они представляют, а не, например, TheseLetters
.
Это решение - с реальным шагом синтаксического анализа - является превосходным, потому что почти наверняка вы захотите сделать больше с этими данными в какой-то момент, и это позволит вам фактически получить доступ к компонентам данных легко. Кроме того, это приемлемо для будущего сопровождающего, поскольку причина причины за заказом несколько ясна. В отличие от этого, если вы решили выполнять сложную строчную обработку, часто очень сложно понять, что происходит (особенно, если это часть более крупной программы, а не крошечный пример, как здесь).
Создание новых типов дешево. Если возвращаемое значение вашего метода не совсем «подходит» в существующем типе, просто создайте новый, даже если это означает 1000 типов.
Ваш раздел «Эти буквы» повторяет «А»; это делает любое упорядочение неоднозначным. Учитывая ваш пример, кажется, что A следует за I, и, следовательно, исходный A является ошибкой. –