【问题标题】:Retrieve Data From IEnumerable?从 IEnumerable 中检索数据?
【发布时间】:2012-03-01 05:56:03
【问题描述】:

[来自 MSDN 的交叉邮件]

我有一个任务,我需要将一个通用列表发送到一个方法,我需要对其进行迭代并将其转换为 Excel 文件。我已经用数据表做到了这一点,但是使用通用列表我遇到了一些问题(我不想将我的通用列表转换为数据表)。我将粘贴有助于我回答的代码。

我有两个通用列表

            List<User>       objList = new List<User>();
            List<Student> objStudent = new List<Student>();

// 我正在向列表中添加一些项目

            User obj = new User(1, "aaa");
            User obj1 = new User(2, "bbb");
            User obj2 = new User(3, "ccc");
            User obj3 = new User(4, "ddd");


            Student sobj = new Student(1, "aaa");
            Student sobj1 = new Student(2, "bbb");
            Student sobj2 = new Student(3, "ccc");
            Student sobj3 = new Student(4, "ddd");
            objList.Add(obj);ExportToExcel(objList);

要将其导出到 Excel,我将列表传递给以下方法

    public void ExportToExcel<T>(IEnumerable<T> list)
    {
        PropertyInfo[] piT = typeof(T).GetProperties();

        var Users = list.ToList();

        Type myType = (typeof(T));
    }

当我将列表传递给 Ienumerable... 时,我无法检索 List IEnumerable 列表中的数据。如果我检索数据,那么我可以进一步处理。任何人都可以建议我更好的想法吗?

【问题讨论】:

    标签: c# list ienumerable


    【解决方案1】:

    如果您总是使用List&lt;T&gt;,您可以将IEnumerable&lt;T&gt; 更改为IList&lt;T&gt;。 AFAIK IEnumerable 接口没有定义访问集合内数据的方法,只是对其进行迭代。

    如果适合您的需要,您甚至可以使用ICollection&lt;T&gt;

    【讨论】:

    • IList 可能不会,但IList&lt;T&gt; 肯定会。此外,除非 OP 需要 add 数据到他们的集合IEnumerable&lt;T&gt; 应该绰绰有余,只要后端数据源被编码来处理它,它就支持延迟加载数据。这可以在性能上带来天壤之别。 OP 似乎有点模糊,所以我不知道他们是在尝试从集合中读取对象还是在集合中读取对象的属性 in
    • 我忽略了 认为它不会引起任何混乱,所以我就放了它。至于性能部分,我什至想进一步解释:)
    • 请随意提问(尽管它可能会被当作骗子关闭;))。
    • 接口本身没有,但是它们是接口的事实将实现留给了底层数据源(这就是真正的魔法发生的地方)。一个好的起点是在 C# 中查找 yield return
    • @Bhuvan - 实际上这取决于您的使用情况。如果您每次都要迭代整个集合,那么它只会推迟不可避免的事情,但是如果您使用 LINQ(例如),它可以使仅将一部分数据限定为可能与所有数据相比有所不同它(想想SingleOrDefault,它的目的是只考虑可能包含数百个甚至数百万个对象的数据集中的单个结果)。它确实改变了人们对 DAL 的看法,并且可以从根本上影响应用程序的架构。
    【解决方案2】:

    如果您需要访问T 类型上所有属性的值,可以使用PropertyInfo.GetValue 方法:

    public void ExportToExcel<T>(IEnumerable<T> items)
    {
        var properties = typeof(T).GetProperties();
    
        foreach(var item in items)
        {
            foreach(var property in properties)
            {
                var value = property.GetValue(item, null);
    
                // Do something else with the property's value
            }
        }
    }
    

    根据评论进行编辑

    您表示您可能会收到一个列表或列表列表。您可以添加另一个采用组合列表的重载,然后遍历它并导出每个单独的列表:

    public void ExportToExcel<T>(IEnumerable<IEnumerable<T>> itemSets)
    {
        foreach(var itemSet in itemSets)
        {
            ExportToExcel(itemSet);
        }
    }
    

    【讨论】:

    • 嗨,布莱恩,谢谢您的回答。但有一点疑问,如果我在 {{var value = property.GetValue(item, null)}} 中获得我的值作为通用列表,我该如何迭代它?我失败了?你能帮我解决这个问题吗?
    • @Bhuvan: value 将被输入为object,因此如果您需要更具体的类型,则必须强制转换它。如果没有更具体的例子,很难给你指导;你能提供更多关于你想要做什么的信息吗?
    • :- 从 BL,我可能会收到任何类型的列表到我的方法,所以我可能会收到一个列表(您为此提供了一个示例 sn-p)。或包含所有子列表的父列表。但是问题出现在列表中,我无法在子列表中转换和迭代条款。由于值类型是 OBJECT,所以在 DAL 中我可能不知道实体类型,因为我将列表作为 IEnumerable 接收。所以我需要一个信息,如果我们有任何选择,我们如何迭代子列表
    • @Bhuvan:如果一个属性恰好是一个列表,听起来你想遍历子列表。我更新了答案以解决这个问题。
    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 2013-08-06
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多