基于目标列表重排的源与目标列表属性交集排序异常问题
问题原因分析
你的排序逻辑失效的核心原因是: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
相关产品推荐
相关产品推荐

