65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 LINQ 和 Lambda 表达式进行通用排序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (7投票s)

2009 年 6 月 22 日

CPOL

1分钟阅读

viewsIcon

115331

这个类使用泛型和 LINQ Lambda 表达式对对象进行排序。

引言

对对象进行排序一直是编程问题,从一门科学发展到仅仅几行代码。虽然它不像我进入这个行业之前那样需要大量的考虑,但它仍然同样重要。本文探讨了使用 Lambda 表达式和泛型进行排序。在我看来,这是迄今为止我见过的对对象进行排序的最佳技术。这个类已经在我的 Utils 程序集中找到了一个确定的位置,所以我与你分享它。

背景

作为程序员,我们始终有责任和乐趣去寻找更好的方法来做同样的事情。这就是我偶然发现这种排序技术的原因。我正在一个项目上工作,该项目有几个需要分页和排序的网格,并且像许多项目一样,我们正在使用对象模型。我正在考虑创建一个通用的排序类,该类在一个地方完成所有工作,而本文分享了结果。

使用代码

为了提高可读性,这些示例从我的实际实现中简化了一些。但是,在查看这段代码之后,我相信你像我一样能够想到几种巧妙的使用这种技术的方法。

排序类的用法

C#

GenericSorter<surveystateformatdata> gs = new GenericSorter<surveystateformatdata >();
SurveyStateFormatItems = gs.Sort(SurveyStateFormatItems.AsQueryable, 
                                 sortExpression, sortDirection).ToArray();

VB.NET

Dim gs As New GenericSorter(Of SurveyStateFormatData)
SurveyStateFormatItems = gs.Sort(SurveyStateFormatItems.AsQueryable, _
                                 sortExpression, sortDirection).ToArray()

这是排序类

C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Linq.Expressions; 


public class GenericSorter<T>
{
    public IEnumerable<T> Sort(IEnumerable<T> source, string sortBy, string sortDirection)
    {
        var param = Expression.Parameter(typeof(T), "item");

        var sortExpression = Expression.Lambda<Func<T, object>>
            (Expression.Convert(Expression.Property(param, sortBy), typeof(object)), param);

        switch (sortDirection.ToLower())
        {
            case "asc":
                return source.AsQueryable<T>().OrderBy<T, object>(sortExpression);
            default:
                return source.AsQueryable<T>().OrderByDescending<T, object>(sortExpression);

        } 
    }
}

VB.NET

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Linq.Expressions

Public Class GenericSorter(Of T)

    Public Function Sort(ByVal source As IEnumerable(Of T), _
                         ByVal sortBy As String, _
                         ByVal sortDirection As String) As IEnumerable(Of T)

        Dim param = Expression.Parameter(GetType(T), "item")

        Dim sortExpression = Expression.Lambda(Of Func(Of T, Object))_
        (Expression.Convert(Expression.[Property](param, sortBy), _
        GetType(Object)), param)

        Select Case sortDirection.ToLower
            Case "asc"
                Return source.AsQueryable().OrderBy(sortExpression)
            Case Else
                Return source.AsQueryable().OrderByDescending(sortExpression)
        End Select

    End Function

End Class

历史

  • 文章添加日期:(2009/06/22)。
使用 LINQ 和 Lambda 表达式进行泛型排序 - CodeProject - 代码之家
© . All rights reserved.