Linq OrderBy使用自定义排序顺序

时间:2014-04-03 19:50:45

标签: c# linq sorting nhibernate enums

我目前正在使用类型和属性名称动态构建linq表达式树,其代码位于此处:“Dynamic LINQ OrderBy on IEnumerable<T>”,请参阅接受的答案。

这适用于大多数属性,但是当属性类型是枚举时我需要自定义排序顺序,例如按值的字符串表示进行排序,根据语言的不同可能会有所不同。

E.g。我有车辆清单列表。

public enum VehicleType : int
{
    Car = 1,
    Train = 2,
    Bike = 3,
    etc...
}

在英文中,名称将是“Car”,“Bike”和“Train”,但在法语中它们将是“Voiture”,“Train”和“Vélo”,所以显然排序顺序会有所不同。

构建的表达式必须与NHibernate(版本3.3.1.4000)兼容。在枚举排序之前和之后可能会添加各种类型。

我有针对给定语言正确排序的枚举列表(或数组),例如在英文中,列表将被命令为“自行车”,“汽车”和“火车”以及法语“火车”,“自行车”和“汽车”,其转换为所需的顺序为3,1,2或2,3, 1。

无法从数据库中访问枚举值的转换。例如。我找不到给定值和语言的名称。

基本上我需要的是一种通过排序列表中枚举值的索引对搜索结果进行排序的方法。

这可能吗?

3 个答案:

答案 0 :(得分:0)

您可以按如下方式获取枚举项的int值:

int enumItemValue = (int)YourEnum.EnumItem1;

使用该整数值来排序列表

如何定义每种语言的顺序

创建自定义属性,其中包含每种语言的枚举项的顺序。 请参阅:http://msdn.microsoft.com/en-us/library/sw480ze8.aspx

答案 1 :(得分:0)

所以建立sjkm的答案你应该能够像这样做。

VehicleList.OrderBy(Vehicle => (int)Vehicle.VehicleType);

此外,您需要确保您拥有System.Linq的使用声明。

答案 2 :(得分:0)

我最终使用Microsoft编写的System.Linq.Dynamic代码以字符串形式构建订单。

E.g。 &#34; VehicleType = Bike? 0:1,VehicleType = Car? 0:1,VehicleType =火车? 0:1&#34;

然后我将它传递给order by extension方法,该方法将其解析为正确的表达式树(例如,我无法弄清楚的位)。

对于任何感兴趣的人,您可以从此处下载System.Linq.Dynamic代码:http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx,或者其他人已将其作为包添加到NuGet上。