У меня есть класс в качестве примера, содержащий две точки данных:
public enum Sort { First, Second, Third, Fourth }
public class MyClass
{
public MyClass(Sort sort, string name) {
this.Sort = sort;
this.Name = name;
}
public Sort Sort { get; set; }
public string Name { get; set; }
}
Я надеюсь сортировать их в группы их Sort
свойство, и затем располагает в алфавитном порядке те группы.
List<MyClass> list = new List<MyClass>() {
new MyClass(MyClass.Sort.Third, "B"),
new MyClass(MyClass.Sort.First, "D"),
new MyClass(MyClass.Sort.First, "A"),
new MyClass(MyClass.Sort.Fourth, "C"),
new MyClass(MyClass.Sort.First, "AB"),
new MyClass(MyClass.Sort.Second, "Z"),
};
Вывод затем был бы: (показ Name
)
A
AB
D
Z
B
C
Я смог сделать это при помощи a foreach
для разделения объектов на многие меньшие массивы (сгруппированный перечислением значений), но это кажется очень утомительным - и я думаю, что должно быть некоторое решение LINQ, о котором я не знаю.
Используя методы расширения, сначала OrderBy
перечисление, ThenBy
имя.
var sorted = list.OrderBy( m => m.Sort ).ThenBy( m => m.Name );
Думаю, это должно сработать
var result = from m in list
orderby m.Sort, m.Name
select m;
Помимо хороших решений LINQ, вы также можете сделать это с помощью упомянутого вами метода сравнения. Сделайте так, чтобы MyClass
реализовал интерфейс IComparable
с помощью метода CompareTo
, например:
public int CompareTo(object obj)
{
MyClass other = (MyClass)obj;
int sort = this.srt.CompareTo(other.srt);
return (sort == 0) ? this.Name.CompareTo(other.Name) : sort;
}
Вышеупомянутый метод сначала упорядочит ваши объекты по перечислению, а если перечисление значения равны, сравнивает имя. Затем просто вызовите list.Sort ()
, и он выведет правильный порядок.