如何将含int、string属性的对象列表转换为全string属性的对象列表
这个需求太常见了!本质上就是遍历原列表,把每个对象的非字符串属性转换成字符串类型,再映射到目标结构里就行。下面我分几种主流语言给你具体的实现方案,都是日常开发里常用的写法:
C# 实现
手动映射(推荐,类型安全)
首先定义好原对象和目标对象的结构,然后用LINQ的Select逐个转换:
// 原数据结构 public class OriginalItem { public int Cd { get; set; } public string Name { get; set; } } // 目标数据结构(所有属性都是string) public class TargetItem { public string Cd { get; set; } public string Name { get; set; } } // 转换逻辑 List<OriginalItem> originalList = GetYourOriginalList(); // 替换成你的原列表 List<TargetItem> targetList = originalList .Select(item => new TargetItem { Cd = item.Cd.ToString(), // int转string Name = item.Name // 直接复用原string属性 }) .ToList();
如果你的Cd是可空int(int?),记得处理null情况:
Cd = item.Cd?.ToString() ?? string.Empty; // 空值时返回空字符串
反射批量转换(适合属性很多的场景)
如果对象有几十上百个属性,手动写映射太麻烦,可以用反射批量处理,但要注意反射有一定性能开销,小列表无所谓:
public static List<TTarget> ConvertToAllString<TOriginal, TTarget>(List<TOriginal> originalList) where TTarget : new() { var targetList = new List<TTarget>(); var originalProps = typeof(TOriginal).GetProperties(); var targetProps = typeof(TTarget).GetProperties(); foreach (var originalItem in originalList) { var targetItem = new TTarget(); foreach (var targetProp in targetProps) { // 按属性名匹配 var originalProp = originalProps.FirstOrDefault(p => p.Name.Equals(targetProp.Name)); if (originalProp != null) { var value = originalProp.GetValue(originalItem); // 转换为string,空值处理为空字符串 targetProp.SetValue(targetItem, value?.ToString() ?? string.Empty); } } targetList.Add(targetItem); } return targetList; } // 使用方式 List<TargetItem> targetList = ConvertToAllString<OriginalItem, TargetItem>(originalList);
Java 实现
手动映射(Stream API 写法)
同样先定义实体类,然后用Stream的map方法转换:
// 原实体类 class OriginalItem { private int cd; private String name; // 构造器、getter、setter 自行补充 } // 目标实体类 class TargetItem { private String cd; private String name; // 构造器、getter、setter 自行补充 } // 转换逻辑 List<OriginalItem> originalList = getYourOriginalList(); // 替换成你的原列表 List<TargetItem> targetList = originalList.stream() .map(item -> { TargetItem target = new TargetItem(); target.setCd(String.valueOf(item.getCd())); // int转string target.setName(item.getName()); return target; }) .collect(Collectors.toList());
如果用Java 16+的record,代码会更简洁:
record OriginalItem(int cd, String name) {} record TargetItem(String cd, String name) {} // 转换一行搞定 List<TargetItem> targetList = originalList.stream() .map(item -> new TargetItem(String.valueOf(item.cd()), item.name())) .collect(Collectors.toList());
Python 实现
Python的写法更灵活,不用严格定义类,字典或者dataclass都可以:
用Dataclass(类型安全)
from dataclasses import dataclass from typing import List @dataclass class OriginalItem: cd: int name: str @dataclass class TargetItem: cd: str name: str # 示例原列表 original_list = [OriginalItem(1, "Alice"), OriginalItem(2, "Bob")] # 转换:列表推导式直接映射 target_list = [TargetItem(str(item.cd), item.name) for item in original_list]
用字典(无需定义类)
如果不需要实体类,直接用字典处理更轻便:
# 原列表(字典形式) original_list = [{"Cd": 1, "Name": "Alice"}, {"Cd": 2, "Name": "Bob"}] # 转换 target_list = [{"Cd": str(item["Cd"]), "Name": item["Name"]} for item in original_list]
额外注意点
- 如果需要特殊格式的字符串转换(比如int转成带前导零的字符串),可以用格式化方法:
- C#:
item.Cd.ToString("D3")(转成3位,不足补零) - Java:
String.format("%03d", item.getCd()) - Python:
f"{item.cd:03d}"
- C#:
- 处理空值时,要根据业务需求决定是返回空字符串还是保留null,避免出现
NullReferenceException或者AttributeError。
内容的提问来源于stack exchange,提问作者Katsumoto
相关产品推荐
相关产品推荐

