假设我们有一个用户界面,在这个用户界面中我们有一个下拉列表。此下拉列表中包含枚举值的翻译值。
Bow,我们可以按枚举的int值,枚举的名称和枚举的翻译名称进行排序。
但是,如果我们想要一个与上面提到的3不同的排序怎么办?如何处理这样的要求?
答案 0 :(得分:11)
实施您自己的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);
}
}
}
}
答案 1 :(得分:9)
你可以使用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);
然后将不同的排序选项包装到方法中,并根据用户首选项/输入调用正确的排序方法。
答案 2 :(得分:3)
IEnumerable<T>.OrderBy(Func<T, TKey>, IComparer<TKey>)
答案 3 :(得分:1)
使用Linq对FileSystemRights枚举进行排序并绑定到WinForms comboBox:
comboBox1.DataSource = ((FileSystemRights[])Enum.GetValues(typeof(FileSystemRights))).
OrderBy(p => p.ToString()).ToArray();
答案 4 :(得分:0)
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;
}
}
您可以为扩展元组添加不同的参数以用于不同的排序选项等。