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

如何将List<object[]>转换为List<object>(元素数量动态可变)

动态列数下List<object[]>转List的解决方案

场景1:将所有数组元素平铺为一维List

如果需求是把List<object[]>中所有数组的元素全部展开,合并成单一的List<object>,直接用LINQ的SelectMany方法即可,无需关心数组长度:

List<object[]> listOfArrays = dt.Select().Select(row => row.ItemArray).ToList();
List<object> flatList = listOfArrays.SelectMany(arr => arr).ToList();

该方法会遍历每个object[],将内部元素依次加入新列表,适配任意数组长度。

场景2:将每个object[]转为带动态属性的对象(对应DataTable列)

如果需求是像固定列时那样,把每个object[]转成带有对应列名属性的对象(适配动态列数),可以用ExpandoObject结合DataTable列名实现:

List<object[]> listOfArrays = dt.Select().Select(row => row.ItemArray).ToList();
List<object> dynamicObjects = new List<object>();

foreach (var arr in listOfArrays)
{
    dynamic expando = new ExpandoObject();
    var expandoDict = (IDictionary<string, object>)expando;
    
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        expandoDict[dt.Columns[i].ColumnName] = arr[i];
    }
    
    dynamicObjects.Add(expando);
}

每个动态对象的属性名对应DataTable列名,属性值匹配数组元素,完美适配列数动态变化的场景。

若偏好LINQ写法,可封装为方法调用:

public static object ToDynamicObject(DataTable dt, object[] itemArray)
{
    dynamic expando = new ExpandoObject();
    var dict = (IDictionary<string, object>)expando;
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        dict[dt.Columns[i].ColumnName] = itemArray[i];
    }
    return expando;
}

// 调用示例
List<object> dynamicObjects = dt.Select()
                                .Select(row => ToDynamicObject(dt, row.ItemArray))
                                .ToList();

如果不需要动态属性访问,用Dictionary<string, object>更轻量:

List<Dictionary<string, object>> dictList = dt.Select()
    .Select(row => dt.Columns.Cast<DataColumn>()
        .ToDictionary(col => col.ColumnName, col => row[col]))
    .ToList();

// 转为List<object>
List<object> objectList = dictList.Cast<object>().ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:38:22