如何依据动态字符串列表对C#对象列表实现动态排序?
动态排序ProduitEdi列表的实现方案
需求说明
我有一个ProduitEdi类型的对象列表,原本通过硬编码实现了按Family→Brand→Price→Year的固定顺序排序,但现在需要根据动态生成的属性名称列表(比如示例中的[Year,Price,Family,Brand])来执行排序,排序优先级完全遵循该列表的顺序。
原硬编码实现代码:
public void DynamicalSort(List<ProduitEdi> lProd,List<Affichages> Affichages) { var ordredAffichages = Affichages.Where(x => x.IsActive).OrderBy(y => y.Ordre).ToList(); // 最终得到属性名列表:[Year,Price,Family,Brand] lProd.Sort((prod1, prod2) => { int compare = String.Compare(prod1.Family, prod2.Family, StringComparison.Ordinal); if (compare != 0) return compare; compare = String.Compare(prod1.Brand, prod2.Brand, StringComparison.Ordinal); if (compare != 0) return compare; compare = prod1.Price != null ? String.Compare(prod1.Price, prod2.Price, StringComparison.Ordinal) : 1; if (compare != 0) return compare; compare = prod1.Year != null ? String.Compare(prod1.Year, prod2.Year, StringComparison.Ordinal) : 1; return compare; }); }
解决方案
要实现动态排序,核心是遍历动态生成的属性名列表,依次比较两个对象的对应属性值,直到找到第一个不相等的比较结果返回即可。我们可以通过反射来动态获取属性值,同时保留原代码中对null值的处理逻辑。
修改后的代码如下:
using System.Reflection; public void DynamicalSort(List<ProduitEdi> lProd, List<Affichages> Affichages) { // 提取排序用的属性名称列表,按指定顺序排列 var sortedPropertyNames = Affichages.Where(x => x.IsActive) .OrderBy(y => y.Ordre) .Select(y => y.PropertyName) // 假设Affichages类有PropertyName字段存储属性名(如"Year"、"Price") .ToList(); lProd.Sort((prod1, prod2) => { foreach (var propName in sortedPropertyNames) { // 动态获取属性信息 PropertyInfo prop = typeof(ProduitEdi).GetProperty(propName); if (prop == null) continue; // 忽略不存在的属性 // 获取两个对象的属性值 string val1 = prop.GetValue(prod1) as string; string val2 = prop.GetValue(prod2) as string; // 处理null值:null默认排在非null值之后;两者都为null则继续比较下一个属性 if (val1 == null && val2 == null) continue; if (val1 == null) return 1; if (val2 == null) return -1; // 比较属性值,有结果则立即返回 int compareResult = String.Compare(val1, val2, StringComparison.Ordinal); if (compareResult != 0) { return compareResult; } } return 0; // 所有属性都相等时返回0 }); }
关键说明
- 反射动态取属性:通过
typeof(ProduitEdi).GetProperty(propName)避免硬编码属性名,适配动态排序规则。 - null值逻辑保留:延续原代码的null值处理逻辑,确保排序结果的一致性。
- 按动态顺序比较:严格遵循
sortedPropertyNames的顺序逐个比较,只要某一属性比较出结果就立即返回,保证排序优先级完全匹配动态列表。
内容的提问来源于stack exchange,提问作者Taieb
相关产品推荐
相关产品推荐

