在C#中查找匿名对象列表中的项

时间:2013-05-13 13:53:53

标签: c# linq anonymous-objects

我有一个匿名对象列表:

var jobs = new List<object>
               {
                 new
                 {
                   JobName = "Job1",
                   JobDate = "Date1",
                   JobUser = "User1"
                 },
                 new
                 {
                   JobName = "Job2",
                   JobDate = "Date2",
                   JobUser = "User2"
                 }
               };

如何使用linq找到“Job2”?

e.g。

var job2 = jobs.Where(x=>x.JobName == "Job2");

我知道以下内容但不能以优雅的方式将其应用于上面的用例:

var anonymJob = new 
                {
                  JobName = "Job2",
                  JobDate = "Date2",
                  JobUser = "User2"
                };

dynamic tJob = anonymJob.GetType();
string jobName = tJob.JobName; // this will be "Job2"

请注意jobs.First()或Last()不被接受,因为这个问题的正确答案是如何根据特定属性查找作业。

由于

4 个答案:

答案 0 :(得分:8)

如果您使用相同的方法,则可以使用匿名类型列表:

var jobs = new [] {
    new { JobName = "Job1", JobDate = "Date1", JobUser = "User1" },
    new { JobName = "Job2", JobDate = "Date2", JobUser = "User2" }
}.ToList();

var job2 = jobs.First(x => x.JobName == "Job2");

隐式类型数组的使用允许您的列表仍然是强类型的,但使用匿名类型。

如果您必须使用List<object>,那么我希望:

IEnumerable<dynamic> dynamicJobs = jobs;
var job2 = dynamicJobs.First(x => x.JobName == "Job2");

上班。请注意,这不涉及复制列表或更改列表的声明类型。你也可以使用:

var job2 = jobs.Cast<dynamic>().First(x => x.JobName == "Job2");

答案 1 :(得分:3)

您可以在查询中使用dynamic

var job2 = jobs.Where(x => ((dynamic)x).JobName == "Job2");

答案 2 :(得分:2)

将其设为List<dynamic>而不是List<object>

然后您可以使用正常的LINQ查询。

答案 3 :(得分:1)

使用List<dynamic>代替List<object>

将其粘贴到LINQPad中以查看:

var jobs = new List<dynamic>
               {
                 new
                 {
                   JobName = "Job1",
                   JobDate = "Date1",
                   JobUser = "User1"
                 },
                 new
                 {
                   JobName = "Job2",
                   JobDate = "Date2",
                   JobUser = "User2"
                 }
               };

jobs.Where(x=>x.JobName == "Job2").Dump();