Java Stream操作的C#等效实现:toMap转换代码改写咨询
将Java流收集Map的代码转换为C#
首先,咱们先明确原Java代码的核心逻辑:把humans集合中的元素,通过指定的键提取方法和值映射逻辑,转换成一个IDictionary<string, Human>(对应Java的Map<String, Human>)。
核心对应关系拆解
- Java的
humans.stream()→ C#中直接用LINQ方法链(如果humans是IEnumerable<Human>类型,无需额外转换;如果是List<Human>这类集合,也天然支持LINQ操作) - Java的
Collectors.toMap(keyMapper, valueMapper)→ C#的ToDictionary(keySelector, elementSelector)方法 - Java的方法引用
this::extractHumanId→ C#的方法组this.ExtractHumanId(遵循C#命名惯例的话,方法名建议用PascalCase,也就是首字母大写;如果原方法名是小写,保持一致也可) - Java的Lambda表达式
human -> idToHuman.get(human.getPassportId())→ C#的human => idToHuman[human.PassportId](C#中字典获取元素用索引器[],功能等价于Java的get()方法)
完整C#代码实现
IDictionary<string, Human> humansMap = humans.ToDictionary( this.ExtractHumanId, human => idToHuman[human.PassportId] );
额外注意事项
- 如果
humans集合中存在重复的键(即ExtractHumanId返回相同值),ToDictionary会抛出ArgumentException。如果需要处理重复键场景,可以通过分组保留最后一个匹配元素:// 处理重复键,保留最后一个匹配的元素 var humansMap = humans .GroupBy(this.ExtractHumanId, human => idToHuman[human.PassportId]) .ToDictionary(g => g.Key, g => g.Last()); - 如果
idToHuman中可能不存在对应的PassportId,Java的get()会返回null,但C#的索引器会抛出KeyNotFoundException。如果要避免异常,可以先过滤存在的键:var humansMap = humans .Where(human => idToHuman.ContainsKey(human.PassportId)) .ToDictionary( this.ExtractHumanId, human => idToHuman[human.PassportId] );
内容的提问来源于stack exchange,提问作者Oleksandr Riznyk
相关产品推荐
相关产品推荐

