Подтвердить что ты не робот

Сортировка перечисления для целей пользовательского интерфейса

Скажем, у нас есть пользовательский интерфейс, и в этом интерфейсе мы имеем выпадающий список. Это выпадающее меню заполнено переведенными значениями перечисления.

Лук, мы имеем возможность сортировать по int-значение перечисления, по имени перечисления и по переводимому имени перечисления.

Но что, если нам нужна другая сортировка, чем упомянутая выше. как обращаться с таким требованием?

4b9b3361

Ответ 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;
        }
    }

И вы можете добавить разные параметры в метод расширения для разных параметров сортировки и т.д.