LINQ查询匿名类型

4
我想知道如何使用LINQ查询一个匿名类型的ArrayList。
我有一个匿名类型的ArrayList。
 var pairs = new ArrayList() { new { id = 1, name = "ram" },` new { id = 2, name = "ramesh" } };

我希望有一个类似以下的工作方式:

    var query = from stud in pairs
                where stud.id==1
                select stud;

这个不起作用是因为匿名类型编译器只能在编译时获取类型,我们该如何处理呢?有什么想法吗?


为什么要使用ArrayList?它是必须使用的吗? - Sergey Berezovskiy
@Servy:一个 List<OfWhat> - Tim Schmelter
@TimSchmelter 匿名类型列表。可以创建一个方法来构造一个列表,给定一些项目,利用方法类型推断来创建列表,或者您可以使用数组创建语法来推断类型,在需要列表而不是数组的情况下调用 ToList - Servy
@AdamHouldsworth:代码无法编译,因为您不能从ArrayList中选择未指定类型的匿名类型。 - Tim Schmelter
1
@Servy 看起来是一个键值对数组,其中 id 是键,名称是值? - Ismail Hawayel
显示剩余6条评论
2个回答

7

ArrayList是.Net中非常古老的部分--避免使用它。如果您使用匿名数组,一切都将正常工作:

var pairs = new [] { new { id = 1, name = "ram" }, new { id = 2, name = "ramesh" } };
var query = from stud in pairs
            where stud.id == 1
            select stud;

4

你可以使用dynamic类型在运行时解析类型:

   var query = from dynamic stud in pairs
               where stud.id == 1
               select stud;

注意:我建议您使用通用集合或者更好的方式是创建一个具有良好命名的类来保存您的数据。假设它应该像这样:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后创建学生列表并查询该列表
var students = new List<Student> {
      new Student { Id = 1, Name = "ram" },
      new Student { Id = 2, Name = "ramesh" }
    };

1
当然,这样做意味着您失去了所有编译时类型安全,并且在列表中的每个项目上运行编译器也会带来相当明显的性能成本。 - Servy
1
@Servy 编译器?DLR 做了很多好的缓存。虽然我通常不会将其作为解决此类问题的解决方案。 - Adam Houldsworth
@sergey 非常感谢。我正在寻找一些可以动态获取类型的东西,“dynamic”解决了这个问题... - Shekar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接