Цель: у вас есть список объектов, вы хотите, чтобы конечный пользователь мог выбрать некоторые свойства объектов для определения сортировки и выбрать направление сортировки для каждого свойства.
Давайте возьмем этот объект Node какНапример:
public class Node
{
public int CustomProperty { get; set; }
public string CustomStringProperty { get; set; }
public string id;
public string parentId;
public string Speed;
public int WheelNumber;
public int SeatNumber;
public List<Node> Child { get; set; }
public Node()
{
Child = new List<Node>();
}
}
Допустим, у вас есть список узлов, которые вы хотите отсортировать на основе таких критериев, как скорость, номер колеса или номер места.
Вы будете использовать любой .OrderBy,.ThenByDescending и т. Д. В зависимости от цели, но проблема в том, что она жестко запрограммирована, поэтому разработчик в настоящее время управляет кодом;конечный пользователь не будет погружаться в код, тем более каждый раз, когда ему нужно изменить коллекцию критериев для сортировки и определить направление для каждого критерия (свойство объекта).
Вы можете использовать некоторый код, помогающий пользователю определитьпредпочтения, что-то вроде этого:
public static List<Node> Sort(List<Node> nodes, int level, string[] sortingPreferences)
{
// Recursively sort nodes children
foreach (var node in nodes)
node.Child = Sort(node.Child, level + 1, sortingPreferences);
// Now sort the nodes based on preference
if (nodes.Count < 2) return nodes;
if (level < sortingPreferences.Length)
{
switch (sortingPreferences[level])
{
case "SPEED": return nodes.OrderBy(node => node.Speed).ToList();
case "WHEEL_NUMBER": return nodes.OrderBy(node => node.WheelNumber).ToList();
case "SEAT_NUMBER": return nodes.OrderBy(node => node.SeatNumber).ToList();
case "SPEED - WHEEL_NUMBER": return nodes.OrderBy(node => node.Speed).ThenBy(node => node.WheelNumber).ToList();
case "SPEED - WHEEL_NUMBER - SEAT_NUMBER": return nodes.OrderBy(node => node.Speed).ThenBy(node => node.WheelNumber).ThenByDescending(node => node.SeatNumber).ToList();
// And so on...
// And so on...
}
}
// Unchanged (or nodes.OrderBy(some default order)
return nodes;
}
Этот пример кода приведен здесь, чтобы проиллюстрировать идиотский подход, то есть вы не охватите все комбинации критериев, чтобы определить свою мультисортировку для применения в списке объектов изатем расширите этот процесс комбинирования, чтобы охватить также направления для каждого из используемых критериев.
Вопрос: Как определить некоторые параметры / предпочтения сортировки, в которых критерии (скорость, номер колеса, номер места ...) будутбыть применены вместе с соответствующим направлением сортировки к списку объектов для его мультисортировки?
Я имею в виду, например, предпочтения могут быть заданы следующим образом:
new List<string>[]
{
new List<string>{ "SPEED", "ASCENDING" },
new List<string>{ "WHEEL_NUMBER", "DESCENDING" },
new List<string>{ "SEAT_NUMBER", "DESCENDING" },
},
Здесь у вас есть3 критерия, но конечный пользователь через графический интерфейс может добавить еще несколько и выбрать направление для каждого из них.
Тогда как учесть эти предпочтения, чтобы применить их в списке объектов?