PriorityOrder is an open source library that allows to order enumerable by priority.
dotnet add package Kurnakov.PriorityOrder
using PriorityOrder;
public class Employee
{
public string Name { get; set; }
public string Role { get; set; }
}
var source = new List<Employee>
{
new Employee() { Name = "Willow", Role = "Manager" },
new Employee() { Name = "Huxley", Role = "Programmer" },
new Employee() { Name = "Tom", Role = "Programmer" },
new Employee() { Name = "Sutton", Role = "Tester" },
new Employee() { Name = "Lev", Role = "HR" },
new Employee() { Name = "Max", Role = "Programmer" },
new Employee() { Name = "Bob", Role = "Manager" },
new Employee() { Name = "Jack", Role = "Tester" },
new Employee() { Name = "Ruby", Role = "Manager" },
new Employee() { Name = "Willow", Role = "Accountant" },
};
// For example, you want to order employees by these specific priorities (not alphabetically).
var priorities = new List<string>()
{
"Programmer",
"Tester",
"Manager",
// After "Manager" order doesn't matter anymore.
};
List<Employee> result = source
.OrderByPriority(x => x.Role, priorities)
.ThenBy(x => x.Name) // Optional.
.ToList();
// result:
// Role: 'Programmer', Name: 'Huxley'
// Role: 'Programmer', Name: 'Max'
// Role: 'Programmer', Name: 'Tom'
// Role: 'Tester', Name: 'Jack'
// Role: 'Tester', Name: 'Sutton'
// Role: 'Manager', Name: 'Bob'
// Role: 'Manager', Name: 'Ruby'
// Role: 'Manager', Name: 'Willow'
// Role: 'HR', Name: 'Lev'
// Role: 'Accountant', Name: 'Willow'
Besides strings you can use enum's, numbers etc (more details you can read on Wiki)
You can look at the full docs on Wiki
I hope this library is useful for you, if so please give a star for this repository, thank you :)