假设我们有一个用户界面,并且在此用户界面中有一个下拉菜单。该下拉列表中填入了enum的翻译值。为用户界面排序枚举
鞠躬,我们有可能通过枚举的int值,枚举的名称和enum的已翻译名称进行排序。
但是,如果我们想要一个不同于上述3的排序呢。如何处理这样的要求?
假设我们有一个用户界面,并且在此用户界面中有一个下拉菜单。该下拉列表中填入了enum的翻译值。为用户界面排序枚举
鞠躬,我们有可能通过枚举的int值,枚举的名称和enum的已翻译名称进行排序。
但是,如果我们想要一个不同于上述3的排序呢。如何处理这样的要求?
实现自己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);
}
}
}
}
IEnumerable<T>.OrderBy(Func<T, TKey>, IComparer<TKey>)
可以使用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);
然后敷不同的排序方案进入方法,并调用根据用户的喜好是正确的/输入。
Perhapse你可以创建为枚举类的扩展方法,像这样:
...先声明......
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;
}
}
而且你可以到扩展梅托德的使用LINQ不同的排序选项等
排序FileSystemRights枚举添加不同的参数并绑定到的WinForms组合框:
comboBox1.DataSource = ((FileSystemRights[])Enum.GetValues(typeof(FileSystemRights))).
OrderBy(p => p.ToString()).ToArray();
那会是什么样的排序吗? – 2009-08-19 10:43:44
一个有用的:)通常是由另一个人认为它应该在某种方式(除开发商设置int值的方式) – karlis 2009-08-19 10:45:45