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

基于目标列表重排的源与目标列表属性交集排序异常问题

问题原因分析

你的排序逻辑失效的核心原因是:dest_props.IndexOf(d) 始终返回 -1。因为 d 是来自 src_props 的 PropertyInfo 实例,和 dest_props 中的实例不是同一个对象——即使它们的属性名完全一致,IndexOf 是基于对象引用相等性判断的,而非属性名。这会导致所有元素的排序键都是 -1,最终排序结果和原列表一致,无法匹配 dest 的属性顺序。

修正方案

我们需要基于属性名在 dest_props 中的位置来排序,而非直接比较 PropertyInfo 实例。可以先构建一个「属性名→在dest中的索引」的字典,再用这个字典作为排序依据:

private static PropertyInfo[] PropertyIntersection(Item dest, Item src)
{
    var srcProps = src.GetType().GetProperties();
    var destProps = dest.GetType().GetProperties();

    // 构建dest属性名到索引的映射,用于快速查找顺序
    var destPropIndexMap = destProps
        .Select((prop, index) => new { prop.Name, index })
        .ToDictionary(x => x.Name, x => x.index);

    // 获取共同属性名的交集
    var commonPropNames = srcProps.Select(p => p.Name)
        .Intersect(destProps.Select(p => p.Name));

    // 筛选src中的共同属性,并按照dest中的顺序排序
    var result = srcProps
        .Where(p => commonPropNames.Contains(p.Name))
        .OrderBy(p => destPropIndexMap[p.Name])
        .ToArray();

    return result;
}
关键改进点
  • 使用字典destPropIndexMap预先存储每个属性名在dest属性列表中的索引,避免重复查找,提升效率。
  • 排序时直接通过属性名从字典中获取对应的索引值,确保排序顺序完全匹配dest的属性顺序。
  • 简化了变量命名,让代码更易读。

内容的提问来源于stack exchange,提问作者Level 42

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:35:04