Vb.net 条件OrderBy

Vb.net 条件OrderBy,vb.net,linq,syntax,Vb.net,Linq,Syntax,所以,现在我有一些用户可以排序的列(名称、县、活动),这很简单,但很混乱。看起来像这样 Select Case e.SortExpression Case "Name" If (isDescending) Then resultsList.OrderByDescending(Function(a) a.Name).ToList() Else

所以,现在我有一些用户可以排序的列(名称、县、活动),这很简单,但很混乱。看起来像这样

        Select Case e.SortExpression
            Case "Name"
                If (isDescending) Then
                    resultsList.OrderByDescending(Function(a) a.Name).ToList()
                Else
                    resultsList.OrderBy(Function(a) a.Name).ToList()
                End If
            Case "County" ... and so on
我想做的,是更多。。。优雅,像这样

Private Function SortThatList(ByVal listOfStuff As List(Of Stuff), ByVal isDescending As Boolean, ByVal expression As Func(Of Stuff)) As List(Of Stuff)
    If (isDescending) Then
        Return listOfStuff.OrderByDescending(expression)
    Else : Return listOfStuff.OrderBy(expression)
    End If
End Function

但它不喜欢(TKey的)数据类型。。。我已经厌倦了Func(boolean)(在c#中有一些东西可以很好地工作),但似乎无法让这个做我想要的。思想?神奇的语法是什么?

在VB中,这是一个带有额外参数的扩展方法。您可能缺少的是方法名称后面的
(TSource,TKey)
,相当于C#中的


公共函数OrderBy(属于TSource,TKey)(ByVal源作为IEnumerable(属于TSource),ByVal作为布尔值,ByVal选择器作为Func(属于TSource,TKey))作为IORDerenumerable(属于TSource)
返回If(isDescending、source.OrderByDescending(选择器)、source.OrderBy(选择器))
端函数
c语言的公认答案#以防有人来看

public IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, bool isDescending, Func<TSource, TKey> selector)
{
    return isDescending ? source.OrderByDescending(selector) : source.OrderBy(selector);
}
C#


我不知道您的问题的解决方案,但我认为,通过添加一个扩展方法可以实现更好的接口,该扩展方法是超负荷的
OrderBy
,但需要一个额外的布尔参数,例如,
false
,如果它应该“升序”排序。例如,
listofsuff.OrderBy(expression,isdescind)
…你能发布C代码让我们看看你想要什么吗?C代码有点像这个公共列表(expression)
public IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, bool isDescending, Func<TSource, TKey> selector)
{
    return isDescending ? source.OrderByDescending(selector) : source.OrderBy(selector);
}
listOfStuff.OrderBy(isDescending, Function(x) x.Name)
listOfStuff.OrderBy(isDescending, x => x.Name);