vb.net - 当按列排序可能不同时,使用 LINQ 对 DataTable 进行排序

标签 vb.net linq

我需要对数据表进行排序,但按列排序有所不同。

场景 #1,DataTable1 应按“Column1”排序。

场景 #2,DataTable2 应按“Column1、Column2”排序。

下面是我为此目的创建辅助函数的第一次尝试。这工作正常。

Private Sub SortDataTable(ByRef dataTable As DataTable, ByVal sortColumnNames As List(Of String))
    'Validation (not shown here)

    Dim sortOrder = String.Join(", ", sortColumnNames)

    dataTable.DefaultView.Sort = sortOrder
    dataTable = dataTable.DefaultView.Table
End Sub

我尝试在 LINQ 中实现此功能,但是,我不知道如何将多个按列排序传递给 lambda 函数。正在进行的代码如下所示。

Private Sub SortDataTable(ByRef dataTable As DataTable, ByVal sortColumnNames As List(Of String))
        'Validation (not shown here)

        dataTable.AsEnumerable().OrderBy(Function (row) row(sortColumnNames(0))).ThenBy(...)
    End Sub

我应该如何将多个按列排序传递给 OrderBy/ThenBy 扩展方法?

最佳答案

类似的事情:

Private Function SortDataTable(table As DataTable, ParamArray columns As String()) As DataTable
    If columns.Length = 0 Then
        Return table
    End If

    firstColumn = columns.First()

    Dim result = table.AsEnumerable().OrderBy(Function(r) r(firstColumn))

    For Each columnName As var In columns.Skip(1)
        result = result.ThenBy(Function(r) r(columnName))
    Next

    Return result.AsDataView().ToTable()

End Function

从此 C# 代码转换而来(我用 C# 编写了此代码,然后使用 http://www.developerfusion.com/tools/convert/csharp-to-vb/ ):

DataTable SortDataTable(DataTable table, params string[] columns)
{
    if (columns.Length == 0)
    {
        return table;
    }

    firstColumn = columns.First();

    var result = table.AsEnumerable().OrderBy(r => r[firstColumn]);

    foreach (var columnName in columns.Skip(1))
    {
        result = result.ThenBy(r => r[columnName]);
    }

    return result.AsDataView().ToTable();
}

PS:没有测试过。但这非常简单,所以应该没有问题。

关于vb.net - 当按列排序可能不同时,使用 LINQ 对 DataTable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16691900/

相关文章:

c# - 为什么只有字符串是不可变的而不是其他数据类型

c# - 如何将 lambda 表达式翻译成英文?

c# - 使用 LINQ 如何根据范围确定 IEnumerable 的优先级?

c# - 在 linq 中检查字符串是否为 null 或为空

c# - 为什么 Linq Cast<> 助手不能与隐式转换运算符一起使用?

asp.net - Excel 文件 "Open" "Save As"对话框未显示在 asp.net 中

MySQL数据库与ASP.NET全局连接

asp.net - 如何隐藏复选框列表中未选中的项目?

sql-server - EF Core Linq 中子查询的总和

c# - 在同一个 LINQ 查询中从不同的命名空间读取 XML 值