You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何依据动态字符串列表对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:40:41