您可以编写自己的(扩展)方法来执行此类排序(为简单起见,它用于 DataRows 序列,但您可以使用相同的方法创建通用版本):
public static IEnumerable<DataRow> SortByNonEmpty(
this IEnumerable<DataRow> source, string columnName)
{
var query = from r in source
let value = r.Field<string>(columnName)
where !String.IsNullOrEmpty(value)
orderby value
select r;
using (var ordinalEnumerator = source.GetEnumerator())
using (var sortedEnumerator = query.GetEnumerator())
{
while (ordinalEnumerator.MoveNext())
{
if (String.IsNullOrEmpty((ordinalEnumerator.Current.Field<string>(columnName))))
yield return ordinalEnumerator.Current;
sortedEnumerator.MoveNext();
yield return sortedEnumerator.Current;
}
}
}
它使用两个枚举器 - ordinalEnumerator 以原始顺序枚举序列,sortedEnumerator 枚举列中具有非空值的排序序列。 IE。如果您将原始值视为["", "b","","c","a",""],那么第一个枚举器将按原始顺序枚举所有元素。第二个枚举器将只产生元素["a","b","c"]。
然后我们只检查源序列中的每个项目。如果它在列中有空值,那么我们只返回该行(从而保留空值的顺序)。否则,我们从有序序列中取出下一个项目。因此,非空值将按排序顺序排列。
用法:
datatable.AsEnumerable().SortByNonEmpty("ColName")
测试
DataTable table = new DataTable();
table.Columns.Add("Id", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Rows.Add(1, "");
table.Rows.Add(2, "b");
table.Rows.Add(3, "");
table.Rows.Add(4, "c");
table.Rows.Add(5, "a");
table.Rows.Add(6, "");
table.AsEnumerable().SortByNonEmpty("Name")
输出
[
{ "Id": 1, "Name": "" },
{ "Id": 5, "Name": "a" },
{ "Id": 3, "Name": "" },
{ "Id": 2, "Name": "b" },
{ "Id": 4, "Name": "c" },
{ "Id": 6, "Name": "" }
]