UWP DataGrid排序场景下Linq查询的优化实现方案咨询
UWP DataGrid 多字段排序优化实现方案
方案1:键选择器映射(无反射,性能最优)
适合字段数量不多、对性能要求高的场景,只需要通过switch表达式匹配列Tag对应的排序字段,无需重复编写排序和赋值逻辑:
// 读取当前点击列的排序字段标识 var sortField = e.Column.Tag.ToString(); // 映射排序字段对应的键选择器 Func<Mountain, object> sortKeySelector = sortField switch { "Country" => item => item.Country, "Name" => item => item.Name, "Height" => item => item.Height, _ => throw new NotSupportedException($"暂不支持对 {sortField} 字段排序") }; // 统一执行排序并刷新列表 var sortedList = myData.OrderBy(sortKeySelector).ToList(); mydg.ItemsSource = new ObservableCollection<Mountain>(sortedList);
后续新增排序字段时,只需要在switch分支中新增一行映射规则即可。
方案2:动态反射取值(零硬编码,维护成本低)
如果字段数量多、后续迭代会频繁新增排序字段,可通过反射动态读取属性值,无需修改排序逻辑:
var sortField = e.Column.Tag.ToString(); // 反射获取对应属性 var property = typeof(Mountain).GetProperty(sortField); if (property == null) return; // 动态按属性值排序 var sortedList = myData.OrderBy(item => property.GetValue(item)).ToList(); mydg.ItemsSource = new ObservableCollection<Mountain>(sortedList);
该方案新增排序字段时,仅需要给对应DataGrid列的Tag属性设置为模型类的属性名即可,无需修改排序代码,普通业务场景下反射带来的性能损耗可以忽略。
扩展:支持升序/降序切换
只需增加全局变量记录上一次排序的字段和方向,即可实现点击同一切换排序顺序:
// 类内私有变量,存储排序状态 private string _lastSortedField; private bool _isAscending = true; // 排序事件逻辑 private void MyDataGrid_Sorting(object sender, DataGridSortingEventArgs e) { e.Handled = true; var currentSortField = e.Column.Tag.ToString(); // 点击同一列切换排序方向,点击不同列默认升序 if (currentSortField == _lastSortedField) { _isAscending = !_isAscending; } else { _isAscending = true; _lastSortedField = currentSortField; } var property = typeof(Mountain).GetProperty(currentSortField); if (property == null) return; // 根据排序方向选择排序方法 var sortedData = _isAscending ? myData.OrderBy(item => property.GetValue(item)) : myData.OrderByDescending(item => property.GetValue(item)); mydg.ItemsSource = new ObservableCollection<Mountain>(sortedData); }
内容的提问来源于stack exchange,提问作者Gregory Bologna
相关产品推荐
相关产品推荐

