在.NET中遍历匿名类型的集合

本文关键字:类型 集合 NET 遍历 | 更新日期: 2023-09-27 18:00:16

我对C#和VB.NET 都满意

我有一个函数GetListOfBook,它返回LINQ到SQL的结果,该结果包含如下对象的集合:

var result=GetListOfBook();

  • Book是一个Book对象标题和ISBN
  • 类别是字符串
  • Author是一个Author对象名称和ID属性

所以在collecton内部,它看起来是这样的:

因此,在"结果"集合中,它看起来是这样的:

{Book = {Book}, Category = "English", Author = {Author}}
{Book = {Book}, Category = "English", Author = {Author}}
{Book = {Book}, Category = "Web Development", Author = {Author}}

我想遍历集合中的每一项,以获得书名、ISBN、类别和作者名称。类似这样的东西:

foreach (var r in result)
{
    Respone.Write(r.Book.Title, r.Book.ISBN, r.Category, r.Auhtor.Name);
}

目前,我还不能对集合进行迭代。谢谢你的建议。

更新:

很抱歉给你添麻烦。这实际上是有效的。我在代码中发现了拼写错误。

在.NET中遍历匿名类型的集合

您仍然需要为foreach使用正确的语法,这需要为循环变量指定类型。由于不能显式命名,因此需要使用var来推断类型。

foreach (var r in result)
{
    Respone.Write(r.Book.Title, r.Book.ISBN, r.Category, r.Auhtor.Name);
}

您需要使用一个隐式类型变量,使用var作为foreach中的迭代变量,就像您的查询从开始一样

var result = ...; // Your existing query
// r is implicitly typed here
foreach (var r in result)
{
    Response.Write(r.Book.Title, r.Book.ISBN, r.Category, r.Author.Name);
}

编辑:仔细看你的代码,我怀疑这就是问题所在:

var result = GetListOfBook();

这不能是强类型的,如果它返回的是匿名类型。。。这意味着它必须返回类似CCD_ 6或CCD_。我怀疑您需要创建一个适当的"normal"类型来包含GetListOfBook的结果,或者使用与Response.Write调用相同的方法执行查询。

您可以使用这样的反射:

foreach (var r in result)
{
    PropertyInfo info = r.GetProperty("Category");
    Response.Write(info.GetValue(r, null));
}

您可以使用反射来访问匿名类型的属性
您可以在此处看到一些示例:http://blogs.msdn.com/b/wriju/archive/2007/10/26/c-3-0-anonymous-type-and-net-reflection-hand-in-hand.aspx

但是,如果您必须使用匿名类型而不是显式类型,那么您应该将其作为最后手段。