【问题标题】:Iterate over a collection of anonymous type in .NET遍历 .NET 中的匿名类型集合
【发布时间】:2011-06-22 08:51:55
【问题描述】:

我对 C# 和 VB.NET 都很好

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

var 结果 = 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);
}

目前,我还无法遍历该集合。感谢您的任何建议。

更新:

很抱歉给您带来麻烦。这实际上是有效的。我在代码中发现了错字。

【问题讨论】:

  • GetListOfBook()的签名是什么?
  • 返回 IQueryable 类型

标签: c# .net vb.net loops


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您需要使用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 调用相同的方法执行查询。

    【讨论】:

    • 你有什么想法让 VS 显示智能感知。因为在这种情况下 r 没有智能感知。
    • @Narazana:这表明您的查询不是强类型的。会更新。
    • 不,它不是强类型。
    • @Narazana:那么您将无法静态访问它,是吗?查看我的编辑。
    【解决方案3】:

    你可以像这样使用反射:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 为什么要使用反射?相反,他唯一的要求是迭代 Collection,这可以通过 loop 和 var 作为返回类型来简单地实现..
      • 如果对象集合中的对象,他不能访问匿名类型的属性。
      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      相关资源
      最近更新 更多