Что в мире делает этот код? (С #) - PullRequest
1 голос
/ 26 августа 2009

Я читал книгу на C #. Я разработчик VB.NET (и очень юный), и у меня много проблем со следующим кодом, который содержит множество вещей, которые я никогда не видел раньше. У меня есть базовые знания о лямбда-выражениях.

public List<T> SortByPropertyName(string propertyName, bool ascending)
{
    var param = Expression.Parameter(typeof(T), "N");

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

    if (ascending)
    {
        return this.AsQueryable<T>().OrderBy<T, object>(sortExpression).ToList<T>();
    }
    else
    {
        return this.AsQueryable<T>().OrderByDescending<T, object>(sortExpression).ToList<T>
    }
}

Может ли кто-нибудь осветить меня относительно того, что делает этот код и какие концепции используются? Я также пытаюсь преобразовать этот код в VB.NET без особой удачи, поэтому любая помощь там будет признательна.

Ответы [ 2 ]

3 голосов
/ 26 августа 2009

В целом, код сортирует что-то (предположительно, список?) По указанному имени свойства в порядке возрастания или убывания. Там уже должен быть общий тип T, указанный где-то еще в этом классе.

Код создает новый ParameterExpression, вызывая Expression.Parameter, затем передает этот параметр в функцию Expression.Lambda, которая создает новое лямбда-выражение.

Это выражение затем используется для сортировки списка путем вызова функции OrderBy или OrderByDescending (выбор зависит от параметра ascending) и возвращает отсортированный список как новый List<T>.

В данный момент я не нахожусь перед Visual Studio, но это должен быть достаточно близкий перевод к VB для вас.

Public Function SortByPropertyName(ByVal propertyName as String, ByVal ascending as Boolean) as List(Of T)
    Dim param = Expression.Parameter(GetType(T), "N")

    Dim sortExpression = Expression.Lambda(Of Func(Of T, Object))(Expression.Convert(Expression.Property(param, propertyName), GetType(Object)), param)

    If ascending Then
        return Me.AsQueryable(Of T).OrderBy(Of T, Object)(sortExpression).ToList()
    Else
        return Me.AsQueryable(Of T).OrderByDescending(Of T, Object)(sortExpression).ToList()
    End If
End Function
0 голосов
/ 05 сентября 2009

Это должно работать:

Return Me.AsQueryable.OrderBy(sortExpression).ToList

Смотри также: http://www.codeproject.com/KB/recipes/Generic_Sorting.aspx

...