Waqas Raja 的回答帮助我解决了问题并写下了这个答案。
按您想要的顺序排序的更简单/更快的方法是使用 DataColumn 的 Expression 属性。
您可以通过多种方式将表达式分配给列
table.Columns.Add(columnName, type, expression);
或
table.Columns.Add(columnName, type);
table.Columns[columnName].Expression = expression;
对于这个问题,我在表达式中使用了 IIF,其作用类似于 If Else 语句
用法:IIF(condition, 'true statement', 'false statement')
想知道什么样的条件可以使用https://docs.microsoft.com/en-us/dotnet/api/system.data.datacolumn.expression?view=net-5.0
下面的方法给出了具有任意数量对象的列表的表达式
private static string GetColumnExpression(List<object> distinctList, string columnName)
{
int counter = 1;
string expression = "";
foreach (var item in distinctList)
{
expression += $"IIF ([{columnName}] = '{item}', {counter++}, ";
}
expression += "0";
for (int k = 0; k < distinctList.Count; k++)
{
expression += ")";
}
return expression;
}
当您应用条件(如 IIF)超过 90/96 的表达式时,它可能会抛出异常,提示 “表达式太复杂”
对于对象超过 90/96 的列表,下面的代码会有所帮助!
private static List<string> GetColumnExpressions(List<string> distinctList, string columnName, string sortingColumn)
{
var list = distinctList;
List<string> expressions = new List<string>();
int maxLimit = 90, listCount = distinctList.Count, counter = 1, loopCount = 1;
while (listCount != 0)
{
string expression = "";
if (loopCount > 1)
{
expression = $"IIF ([ExtraCol] <> 0, [ExtraCol], ";
}
int conditionCount = listCount >= maxLimit ? maxLimit : listCount;
for (int i = 0; i < conditionCount; i++)
{
expression += $"IIF ([{columnName}] = '{list[0]}', {counter++}, ";
list.RemoveAt(0);
}
expression += "0";
for (int k = 0; k < conditionCount; k++)
{
expression += ")";
}
if (loopCount > 1)
{
expression += ")";
}
expressions.Add(expression);
listCount = list.Count;
loopCount++;
}
return expressions;
}
用法如下:
//"MonthNumber" is column Added For Expression/Sorting
var expressions = GetColumnExpressions(list, "Column2", "MonthNumber");
table.Columns.Add("MonthNumber", typeof(int));
string sourceColumn = "MonthNumber", destColumn = "MonthNumber";
for (int k = 0; k < expressions.Count; k++)
{
if (k > 0)
{
destColumn = "Extra" + k;
table.Columns.Add(destColumn, typeof(int));
for (int row = 0; row < table.Rows.Count; row++)
{
table.Rows[row][destColumn] = table.Rows[row][sourceColumn];
}
expressions[k] = expressions[k].Replace("ExtraCol", sourceColumn);
sourceColumn = destColumn;
}
string expression = expressions[k];
table.Columns[destColumn].Expression = expression;
}
排序和删除多余的列
table.DefaultView.Sort = $"{destColumn}";
for (int k = expressions.Count - 1; k > 0; k--)
{
table.Columns.Remove("Extra" + k);
}
table.Columns.Remove("MonthNumber");
var sortedTable = table.defaultView.ToTable();