C# 从IEnumerable检索数据?

C# 从IEnumerable检索数据?,c#,list,ienumerable,C#,List,Ienumerable,[来自MSDN的交叉帖子] 我有一个任务,我需要向一个方法发送一个通用列表,在那里我需要迭代它并将其转换为Excel文件。我已经对数据表做了这项工作,但对于泛型列表,我面临一些问题(我不想将泛型列表转换为数据表)。我将粘贴代码,帮助我找到答案 我有两个通用列表 List<User> objList = new List<User>(); List<Student> objStudent = new L

[来自MSDN的交叉帖子]

我有一个任务,我需要向一个方法发送一个通用列表,在那里我需要迭代它并将其转换为Excel文件。我已经对数据表做了这项工作,但对于泛型列表,我面临一些问题(我不想将泛型列表转换为数据表)。我将粘贴代码,帮助我找到答案

我有两个通用列表

            List<User>       objList = new List<User>();
            List<Student> objStudent = new List<Student>();
要将其导出到Excel,我将列表传递给以下方法,如下所示

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

        var Users = list.ToList();

        Type myType = (typeof(T));
    }
public void ExportToExcel(IEnumerable列表)
{
PropertyInfo[]piT=typeof(T).GetProperties();
var Users=list.ToList();
类型myType=(类型of(T));
}

当我将列表传递给Ienumerable时。。。我无法检索列表IEnumerable列表中的数据。如果我检索数据,那么我可以进一步处理。有谁能给我推荐一个更好的主意吗?

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


如果满足您的需要,您甚至可以使用
ICollection

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

public void ExportToExcel(IEnumerable items)
{
var properties=typeof(T).GetProperties();
foreach(项目中的var项目)
{
foreach(属性中的var属性)
{
var value=property.GetValue(项,空);
//对财产的价值做些其他事情
}
}
}
根据评论进行编辑

您表示可能会收到单个列表或列表列表。您可以添加另一个重载,该重载获取组合的列表,然后对其进行迭代并导出每个单独的列表:

public void ExportToExcel<T>(IEnumerable<IEnumerable<T>> itemSets)
{
    foreach(var itemSet in itemSets)
    {
        ExportToExcel(itemSet);
    }
}
public void ExportToExcel(IEnumerable项集)
{
foreach(itemSet中的var itemSet)
{
ExportToExcel(项目集);
}
}

IList
可能不会,但
IList
肯定会。此外,除非OP需要将数据添加到他们的集合
IEnumerable
应该足够了,而且只要后端数据源被编码来处理它,它就支持延迟加载数据。这可以在性能上产生巨大的差异。虽然OP看起来有点模糊,所以我无法判断他们是在试图读取集合中的对象还是集合中对象的属性。我忽略了这样做不会引起任何混淆的想法,所以我只是把它放在这里。至于性能部分,甚至我也希望得到进一步的解释:)请随意提问(尽管它很可能会以重复的形式关闭;)。接口本身没有,但它们是接口这一事实让实现取决于底层数据源(这才是真正神奇的地方)。一个好的起点是在C#@Bhuvan中查找
yield return
——实际上这取决于您的使用情况。如果您每次都要迭代整个集合,那么它只会推迟不可避免的结果,但是如果您使用LINQ(例如),那么只限定部分数据与所有数据的潜在比较可能会有所不同(想<代码> SingleOrDefault <代码>,它只考虑一个潜在的成百上千个对象的数据集中的单个结果)。它确实改变了人们对DAL的看法,并从根本上影响了应用程序的体系结构。嗨,Bryan,谢谢你的回答。但是,如果我在{{var value=property.GetValue(item,null)}中得到我的值,我会有一点怀疑作为一个通用列表,我如何迭代它?我没能做到这一点?你能帮我一下吗?@Bhuvan:
将被键入
对象
,因此如果你需要一个更具体的类型,你就必须转换它。如果没有更具体的示例,很难给你指导;你能提供更多关于你正在尝试的信息吗要做什么?:-从BL中,我可能会收到我的方法的任何类型的列表,因此我可能会收到一个列表(您为此提供了一个示例片段)。或包含所有子列表的父列表。但问题出现在列表中,我无法在子列表中强制转换和迭代术语。因为值类型是OBJECT,所以在DAL中,我可能不知道实体类型,因为我接收的列表是IEnumerable。因此,我需要一个如何迭代子列表的信息,如果我们有任何choice@Bhuvan:如果某个属性恰好是一个列表,则听起来您希望遍历子列表。我更新了答案以说明这一点。
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);
    }
}