По моему мнению, если рассматривать вопрос как длину, определяющую, какая комната сортируется первой, ошибочна. Если шаблон для названия комнаты - {ROOM-NAME}_{ROOM_NUMBER}
, то трактуйте его так. (Как бы мне не хотелось это говорить, иногда: это может быть работа для регулярных выражений! )
var unordered = new[] { "CCC ROOM 10", "CCC ROOM 5", "AAA ROOM 1", "AAA ROOM 14", "AAA ROOM 2", "AAA ROOM 10", "AAA ROOM 5", "BBB ROOM 3", "BBB ROOM 12" };
Regex pattern = new Regex(@"^(\D+)(\d+)$");
var ordered = unordered
.Select(
r =>
{
Match match = pattern.Match(r);
return new
{
Name = r,
Prefix = match.Groups[1].Value,
Number = Convert.ToInt32(match.Groups[2].Value)
};
}
)
.OrderBy(r => r.Prefix)
.ThenBy(r => r.Number);
foreach (var room in ordered)
{
Console.WriteLine(room.Name);
}
Этот код выдает следующий вывод ...
AAA ROOM 1
AAA ROOM 2
AAA ROOM 5
AAA ROOM 10
AAA ROOM 14
BBB ROOM 3
BBB ROOM 12
CCC ROOM 5
CCC ROOM 10
С помощью этого метода мы называем розу розой (или, в частности, строковое представление числа). Я использовал анонимный тип, чтобы мне не приходилось запускать матч дважды.
РЕДАКТИРОВАТЬ : Я заметил, что вы сказали Visual Studio 2008, поэтому вы можете не использовать .NET 4.0. Если нет, то многострочная лямбда может не работать (я точно не помню, когда это было добавлено). Вот еще один способ с использованием двух регулярных выражений и без анонимного типа. Я не уверен, что мне так больше не нравится, теперь, когда я это написал ...
var rooms = new[] { "CCC ROOM 10", "CCC ROOM 5", "AAA ROOM 1", "AAA ROOM 14", "AAA ROOM 2", "AAA ROOM 10", "AAA ROOM 5", "BBB ROOM 3", "BBB ROOM 12" };
Regex prefix = new Regex(@"^\D+");
Regex suffix = new Regex(@"\d+$");
var ordered2 = rooms
.OrderBy(r => prefix.Match(r).Value)
.ThenBy(r => Convert.ToInt32(suffix.Match(r).Value));
foreach (var room in ordered2)
{
Console.WriteLine(room);
}
Кроме того, я мог бы заметить, что в этом коде явно нет непредвиденных обстоятельств для несоответствия имени. Если это возможно, его нужно будет встроить.
И, наконец, поскольку вы сказали, что вы новичок в разработке, я очень быстро коснусь регулярных выражений:
^\D+
= С самого начала строки найдите мне что-то, что не является цифрой один или несколько раз.
\d+$
= Найдите мне набор из одной или нескольких цифр, за которыми сразу следует конец строки.
EDIT2 : Полагаю, я не ответил на ваш второй вопрос. Ответ на этот вопрос может сильно отличаться в зависимости от того, как форма инициализируется из списка комнат, как вы храните флажки, как вы хотите с ними работать, какие существуют другие структуры данных для хранения остальной информации и так на.