【问题标题】:What in the world does this code do? (C#)这段代码到底做了什么? (C#)
【发布时间】:2009-08-26 14:50:32
【问题描述】:

我一直在读一本用 C# 编写的书。我是一名 VB.NET 开发人员(并且是一名非常初级的开发人员),我在以下代码中遇到了很多麻烦,其中包含很多我以前从未见过的东西。我确实有 Lambda 表达式的基本知识。

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,但运气不佳,因此也将不胜感激。

【问题讨论】:

  • 是我,还是密码坏了? T 在哪里定义?
  • @Mike:我假设这是一个泛型类,可能是继承自 List 的东西。

标签: vb.net lambda c#-to-vb.net


【解决方案1】:

总体而言,代码按指定的属性名称以升序或降序对某些内容(可能是列表?)进行排序。必须已经在该类的其他位置指定了泛型类型T

代码通过调用Expression.Parameter 创建一个新的ParameterExpression,然后将该参数传递给Expression.Lambda 函数,该函数创建一个新的lambda 表达式。

然后,此表达式用于通过调用OrderByOrderByDescending 函数(取决于ascending 参数的选择)对列表进行排序,并将排序后的列表作为新的List&lt;T&gt; 返回。

我现在不在 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

【讨论】:

  • 感谢亚当的回答。我遇到的主要问题是这一行: var sortExpression = Expression.Lambda>(Expression.Convert(Expression.Property(param, propertyName), typeof(object)), param); > 有什么作用?是不是说 Expression.Lambda() 会返回一个泛型函数?
  • Hmm...VS2008 似乎不喜欢:“return Me.AsQueryable(Of T).OrderBy(Of T, Object)(sortExpression).ToList()” 我试过了: Return Queryable.AsQueryable(Of T)(Me).OrderBy(sortExpression).ToList() 它似乎喜欢这样,虽然我不确定它是否在做同样的事情!
【解决方案2】:

这应该可行:

Return Me.AsQueryable.OrderBy(sortExpression).ToList

另请参阅:http://www.codeproject.com/KB/recipes/Generic_Sorting.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 2012-08-29
    • 1970-01-01
    • 2014-12-01
    • 2013-01-24
    • 1970-01-01
    • 2022-06-28
    • 2015-01-16
    相关资源
    最近更新 更多