ArrayList все еще реализует IEnumerable, то есть вы можете использовать простые расширения orderby () и thenby () в linq:
RecordList = new ArrayList(
RecordList.Cast<string>().OrderBy(s => s.Substring(3,3))
.ThenBy(s => int.Parse(s.Substring(0,3)))
.ThenByDescending(s => double.Parse(s.Substring(6,4)))
.ToArray());
Другие способы выразить это включают создание более сложного .OrderBy () или использованиеанонимный тип для составления вашей строки как объекта:
RecordList = new ArrayList(
Record.Cast<string>().Select(s => new {source = s, age = int.Parse(s.Substring(0, 3)), name = s.Substring(3,3), amt = double.Parse(s.Substring(6,4))})
.OrderBy(o => o.name)
.ThenBy(o => o.age)
.ThenByDescending(o => o.amt)
.Select(o => o.source).ToArray());
Мне нравится эта опция, потому что она заставляет вас начать думать в терминах объектов.Правильно разыграйте свои карты, и вы можете пропустить эту последнюю проекцию .Select (), чтобы сохранить объекты, а не возвращаться к строкам, , что избавит вас от необходимости повторного анализа позже .
Если это не вариант (возможно, по той же причине, по которой вы не можете использовать List ), легко изменить существующий метод сравнения следующим образом:
public class ArrComparer : IComparer
{
public int Compare(object x, object y)
{
int result;
string left = x.ToString();
string right = y.ToString();
string lhs1 = left.Substring(3, 3);
string rhs1 = right.Substring(3, 3);
result = lhs1.CompareTo(rhs1);
if (result == 0)
{
int lhs2 = int.Parse(left.Substring(0,3));
int rhs2 = int.Parse(right.Substring(0,3));
result = lhs2.CompareTo(rhs2);
}
if (result == 0)
{
double lhs3 = double.Parse(left.Substring(6,4));
double rhs3 = double.Parse(right.Substring(6,4));
result = rhs3.CompareTo(lhs3);
}
return result;
}
}