首页 / C#开发 / 正文

C#/.NET中泛型对象集合(List<T>)转换成二维数组对象的静态扩展方法(Lambda参数支持对象的任意属性)

6884 2评论 发布于: 2017-08-25 读完约需14分钟

在日常的C#/.NET开发中,我们可能会遇到这样的需求,即本文标题所述:将泛型对象集合(List)转换成二维数组对象的静态扩展方法(Lambda参数支持对象的任意属性)。如我有如下实体:

/// <summary>
    /// 分类目录实体--测试类
    /// </summary>
    public class Category
    {

        /// <summary>
        /// ID
        /// </summary>
        public int Id { get; set; }
        /// <summary>
        /// 语言名称
        /// </summary>
        public string Language { get; set; }
        /// <summary>
        /// 别名
        /// </summary>
        public string Alias { get; set; }
    }

并有一个相关的泛型集合:

_categories = new List<Category>
            {
                new Category{Id=1,Language="C#",Alias="csharp"},
                new Category{Id=2,Language="C",Alias="c"},
                new Category{Id=3,Language="C++",Alias="cpp"},
                new Category{Id=4,Language="Javascript",Alias="javascript"}
            };

如果要基于这个泛型集合,转换成属性对应的二维数组(如下所示),你的实现思路是如何呢?

[[1,"C#"],[2,"C"],[3,"C++"],[4,"Javascript"]]

本文分享一个C#/.NET中泛型对象集合(List)转换成二维数组对象的静态扩展方法(Lambda参数支持对象的任意属性),具体的测试用例如下:

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;

namespace ConsoleApp2
{
    public class Program
    {
        private static List<Category> _categories;
        static void Main(string[] args)
        {
            BuildData();

            DoTest();

            Console.ReadKey();
        }

        /// <summary>
        /// 测试的方法
        /// </summary>
        static void DoTest()
        {
            //只读取ID属性
            var array = _categories.To2DArray(x => x.Id);
            //注意:为便于显示转换结果,本示例使用了第三方的组件--Newtonsoft.Json
            Console.WriteLine(JsonConvert.SerializeObject(array));
            /*
             * 输出结果:
             * [[1],[2],[3],[4]]
             */

            //读取ID,Language属性
            array = _categories.To2DArray(x => x.Id, x => x.Language);
            Console.WriteLine(JsonConvert.SerializeObject(array));
            /*
             * 输出结果:
             * [[1,"C#"],[2,"C"],[3,"C++"],[4,"Javascript"]]
             */

            //读取ID,Language,Alias属性
            array = _categories.To2DArray(x => x.Id, x => x.Language, x => x.Alias);
            Console.WriteLine(JsonConvert.SerializeObject(array));
            /*
             * 输出结果:
             * [[1,"C#","csharp"],[2,"C","c"],[3,"C++","cpp"],[4,"Javascript","javascript"]]
             */
        }

        /// <summary>
        /// 模拟测试数据
        /// </summary>
        static void BuildData()
        {
            _categories = new List<Category>
            {
                new Category{Id=1,Language="C#",Alias="csharp"},
                new Category{Id=2,Language="C",Alias="c"},
                new Category{Id=3,Language="C++",Alias="cpp"},
                new Category{Id=4,Language="Javascript",Alias="javascript"}
            };
        }
    }

    /// <summary>
    /// 分类目录实体--测试类
    /// </summary>
    public class Category
    {

        /// <summary>
        /// ID
        /// </summary>
        public int Id { get; set; }
        /// <summary>
        /// 语言名称
        /// </summary>
        public string Language { get; set; }
        /// <summary>
        /// 别名
        /// </summary>
        public string Alias { get; set; }
    }

    /// <summary>
    /// 实现泛型集合到数组对象转换的静态扩展类
    /// </summary>
    public static class ConverterExtension
    {
        /// <summary>
        /// 实现泛型集合到数组对象转换的静态扩展方法
        /// </summary>
        /// <typeparam name="T">泛型对象</typeparam>
        /// <param name="lines">泛型集合</param>
        /// <param name="lambdas">需要转换的泛型对象属性</param>
        /// <returns>数据对象</returns>
        public static object[,] To2DArray<T>(this List<T> lines, params Func<T, object>[] lambdas)
        {
            var array = new object[lines.Count(), lambdas.Count()];
            var lineCounter = 0;
            lines.ForEach(line =>
            {
                for (var i = 0; i < lambdas.Length; i++)
                {
                    array[lineCounter, i] = lambdas[i](line);
                }
                lineCounter++;
            });

            return array;
        }
    }
}

测试运行结果为:

C#/.NET中泛型对象集合(List)转换成二维数组对象的静态扩展方法(Lambda参数支持对象的任意属性)

补充方案

 List<string[]> list = new List<string[]>();
            _categories.ForEach(x => list.Add(new string[] { x.Id.ToString(), x.Language }));
            var result = list.ToArray();

此方案由网友 CNXY 提供

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: SQL SERVER 2005+ 使用VALUES子句实现一条语句查询一行记录中的最大值

下一篇: Visual Studio 2017 15.4更新版正式发布

本文永久链接码友网 » C#/.NET中泛型对象集合(List<T>)转换成二维数组对象的静态扩展方法(Lambda参数支持对象的任意属性)

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册

热门评论

Rector (2018-01-16 13:44)

也是一种实现方式
回复 赞(0)

CNXY (2018-01-16 08:39)

List list = new List(); _categories.ForEach(x => list.Add(new string[] { x.Id.ToString(), x.Language })); var result = list.ToArray();
回复 赞(0)