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

如何用LINQ将含List字段的MyObject列表转换为NewObject列表?

解决方法:用LINQ将List<MyObject>转换为List<NewObject>

先把你的类定义贴出来方便对照:

public class MyObject 
{ 
    public int Id { get; set; } 
    public List<RandomObject> Items { get; set; } 
}

public class NewObject 
{ 
    public int Id { get; set; } 
    public RandomObject Item { get; set; } 
}

要实现这个转换,核心是把每个MyObject里的Items集合扁平化——让集合里的每一个RandomObject都对应一个NewObject(复用原MyObject的Id)。这时候用LINQ的SelectMany方法最合适,它专门用来处理这种嵌套集合展开+投影的场景。

方法语法版本(日常开发最常用)

// 假设你的源集合是myObjects
List<MyObject> myObjects = GetMyObjects(); // 替换成你的实际数据来源

List<NewObject> newObjects = myObjects
    // 展开每个MyObject的Items,同时关联原对象和单个Item
    .SelectMany(myObj => myObj.Items, (myObj, item) => new NewObject
    {
        Id = myObj.Id, // 复用原MyObject的Id
        Item = item    // 取Items里的单个元素
    })
    .ToList(); // 最终转成List<NewObject>

查询语法版本(SQL风格,可读性强)

如果你更喜欢接近SQL的写法,也可以用查询语法,本质和上面的方法语法完全等价:

List<NewObject> newObjects = (
    from myObj in myObjects
    from item in myObj.Items // 这里的嵌套from就是SelectMany的语法糖
    select new NewObject
    {
        Id = myObj.Id,
        Item = item
    }).ToList();

额外优化:处理Items为null的情况

如果你的MyObject实例可能存在Items为null的情况,直接用上面的代码会抛出空引用异常。可以加个空值判断兜底:

List<NewObject> newObjects = myObjects
    .SelectMany(myObj => myObj.Items ?? Enumerable.Empty<RandomObject>(), (myObj, item) => new NewObject
    {
        Id = myObj.Id,
        Item = item
    })
    .ToList();

这里用?? Enumerable.Empty<RandomObject>()确保当Items为null时,用空序列替代,避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:26:12