C#中如何按指定关联属性合并两个不同对象列表?
问题:通过属性关联合并两个类列表
我有两个类Parameter和RuleSetParameter,希望通过Parameter.Name与RuleSetParameter.ParameterName属性进行关联合并,最终获取对应的ParameterValue。
类定义如下:
public class Parameter { public string Name { get; set; } public string Value { get; set; } } public class RuleSetParameter { public string ParameterName { get; set; } public string ParameterValue { get; set; } public int ParameterType { get; set; } }
我尝试过以下代码,但它只是按顺序映射,无法实现按属性关联的需求:
var parameterDictionary = RuleSetParameter.Zip(parameters).ToDictionary(x => x.First, x => x.Second);
请问该如何实现预期效果?
解决方法
方法1:使用Linq的Join直接关联
这是最直观的实现方式,通过Join方法基于匹配属性关联两个集合,按需提取目标数据:
// 假设你有两个列表:List<Parameter> parameters 和 List<RuleSetParameter> ruleSetParameters var mergedResult = parameters.Join( ruleSetParameters, param => param.Name, // Parameter的关联键 ruleParam => ruleParam.ParameterName, // RuleSetParameter的关联键 (param, ruleParam) => new { ParameterName = param.Name, OriginalParameterValue = param.Value, MappedRuleValue = ruleParam.ParameterValue, RuleParamType = ruleParam.ParameterType } );
如果只需要构建Parameter.Name到ParameterValue的字典:
var paramValueDict = parameters.Join( ruleSetParameters, p => p.Name, rsp => rsp.ParameterName, (p, rsp) => new { p.Name, rsp.ParameterValue } ).ToDictionary(x => x.Name, x => x.ParameterValue);
方法2:先转字典再匹配(大数量场景更高效)
如果RuleSetParameter中的ParameterName是唯一值,先把它转成以ParameterName为键的字典,再遍历Parameter列表匹配,这种方式在数据量较大时性能更优:
var ruleParamDict = ruleSetParameters.ToDictionary(rsp => rsp.ParameterName, rsp => rsp.ParameterValue); // 只保留两边都能匹配到的项 var paramValueDict = parameters .Where(p => ruleParamDict.ContainsKey(p.Name)) .ToDictionary(p => p.Name, p => ruleParamDict[p.Name]);
扩展:保留所有Parameter项
如果需要保留所有Parameter(即使没有对应的RuleSetParameter),可以给无匹配的项设置默认值:
var paramValueDict = parameters.ToDictionary( p => p.Name, p => ruleParamDict.TryGetValue(p.Name, out var value) ? value : null );
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

