迭代.NET中的匿名类型集合

时间:2011-06-22 08:51:55

标签: c# .net vb.net loops

  

我对C#和VB.NET都很好

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

var result = GetListOfBook();

  • Book是Book对象的属性 标题和ISBN,
  • 类别是字符串
  • 作者是具有的作者对象 姓名和身份证明属性。

所以在收藏家里面,它看起来像这样:

所以在“结果”集合中,它看起来像这样:

{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);
}

目前,我无法迭代收藏品。谢谢你的任何建议。

更新

对不起,不好意思。这实际上是有效的。我在代码中发现了拼写错误。

4 个答案:

答案 0 :(得分:7)

您仍需要使用foreach的正确语法,该语法要求您指定循环变量的类型。由于您无法明确命名,因此需要使用var来推断类型。

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

答案 1 :(得分:3)

您需要使用{em>隐式类型变量使用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();

如果它返回匿名类型,则不能强类型...这意味着它必须返回IEnumerableIEnumerable<object>之类的内容。我怀疑您需要创建一个合适的“普通”类型来包含GetListOfBook的结果 - 或者使用与Response.Write调用相同的方法执行查询。

答案 2 :(得分:2)

你可以使用这样的反射:

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

答案 3 :(得分:1)

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

但如果你必须使用匿名类型而不是显式类型,那么你应该真的做到最后。