在.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);
}
目前,我还不能对集合进行迭代。谢谢你的建议。
更新:
很抱歉给你添麻烦。这实际上是有效的。我在代码中发现了拼写错误。
您仍然需要为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
但是,如果您必须使用匿名类型而不是显式类型,那么您应该将其作为最后手段。