Сортировка перечисления для целей пользовательского интерфейса
Скажем, у нас есть пользовательский интерфейс, и в этом интерфейсе мы имеем выпадающий список. Это выпадающее меню заполнено переведенными значениями перечисления.
Лук, мы имеем возможность сортировать по int-значение перечисления, по имени перечисления и по переводимому имени перечисления.
Но что, если нам нужна другая сортировка, чем упомянутая выше. как обращаться с таким требованием?
Ответы
Ответ 1
Внесите свой собственный IComparer
:
using System;
using System.Collections.Generic;
namespace test {
class Program {
enum X {
one,
two,
three,
four
}
class XCompare : IComparer<X> {
public int Compare(X x, X y) {
// TBA: your criteria here
return x.ToString().Length - y.ToString().Length;
}
}
static void Main(string[] args) {
List<X> xs = new List<X>((X[])Enum.GetValues(typeof(X)));
xs.Sort(new XCompare());
foreach (X x in xs) {
Console.WriteLine(x);
}
}
}
}
Ответ 2
Вы можете использовать расширение Linq OrderBy
и выполнить любую магию сравнения, которую вы хотите:
// order by the length of the value
SomeEnum[] values = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));
IEnumerable<SomeEnum> sorted = values.OrderBy(v => v.ToString().Length);
Затем заверните различные альтернативы сортировки в методы и вызовите правильный, основываясь на пользовательских предпочтениях/вводах.
Ответ 3
IEnumerable<T>.OrderBy(Func<T, TKey>, IComparer<TKey>)
Ответ 4
Сортировка перечисления FileSystemRights с использованием Linq и привязка к WinForms comboBox:
comboBox1.DataSource = ((FileSystemRights[])Enum.GetValues(typeof(FileSystemRights))).
OrderBy(p => p.ToString()).ToArray();
Ответ 5
Perhapse вы можете создать метод расширения для класса Enum, например:
... сначала объявление...
public enum MyValues { adam, bertil, caesar };
... затем в методе...
MyValues values = MyValues.adam;
string[] forDatabinding = values.SpecialSort("someOptions");
...The extension method...
public static class Utils
{
public static string[] SpecialSort(this MyValues theEnum, string someOptions)
{
//sorting code here;
}
}
И вы можете добавить разные параметры в метод расширения для разных параметров сортировки и т.д.