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

如何将含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}"
  • 处理空值时,要根据业务需求决定是返回空字符串还是保留null,避免出现NullReferenceException或者AttributeError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:00