当按列排序可能不同时,使用LINQ对DataTable进行排序 [英] Sorting a DataTable using LINQ, when sort-by-columns may vary
问题描述
我需要对DataTables进行排序,但是按列排序会有所不同.
I need to sort DataTables, however the sort-by-columns vary.
场景1,DataTable1应该按"Column1"排序.
Scenario #1, DataTable1 should be sorted by "Column1".
场景2,DataTable2应该按"Column1,Column2"进行排序.
Scenario #2, DataTable2 should be sorted by "Column1, Column2".
下面是我为此目的创建一个辅助函数的第一次尝试.可以.
Below is my first attempt at creating a helper function for this purpose. This works ok.
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函数.正在进行的代码如下所示.
I tried implementing this in LINQ, however, I don't know how to pass multiple sort-by-columns to the lambda function. Work-in-progress code shown below.
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扩展方法?
How should I pass multiple sort-by-columns to the OrderBy/ThenBy extension methods?
推荐答案
类似的东西:
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/):
Converted from this C# code ( I've written this in C# and then used 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:没有测试.但这很简单,应该没有问题.
PS: didn't test that. But that's very simple, so should be no problems.
这篇关于当按列排序可能不同时,使用LINQ对DataTable进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!