使用linq,我可以搜索列表,访问属性并返回特定实例吗?

时间:2011-03-24 07:31:52

标签: c# linq

我有一份建筑清单。每个建筑物都有一个人员清单。我在建筑物里寻找约翰。

假设传统搜索可能如下所示:

List<Building> Buildings = CreateBuildings();
foreach(Building building in Buildings)
{
    foreach(Person person in building.PersonList)
    {
         if (person.Name == "John")
         {
             return person;
         }
    }
}

也正因为我们可以,这是否意味着我们应该?那么这是对LINQ的反模式/滥用吗?

2 个答案:

答案 0 :(得分:6)

看起来像:

var query = from building in Buildings
            from person in building.PersonList
            where person.Name == "John"
            select person;

该查询将找到 all 名为“John”的人。如果您想要第一个这样的人,或者如果找不到这样的人就为null,您可以使用:

var john = query.FirstOrDefault();

请注意,使用扩展方法可以使此查询稍微更高效:

var query = Buildings.SelectMany(x => x.PersonList)
                     .Where(x => x.Name == "John");

或者对于“第一个或默认”版本,您可以在一个步骤中做得更好(再次,非常轻微):

var john = Buildings.SelectMany(x => x.PersonList)
                    .FirstOrDefault(x => x.Name == "John");

这些选项将避免使用查询表达式用于配对(人,建筑物)的自动生成的匿名类型。

是的,这是LINQ的完全有效用途 - 它正是它的设计目的。

答案 1 :(得分:2)

是的,当然,这是LINQ的专长之一,搜索。

var buildings = CreateBuildings();
var person = (from building in buildings
              from person in building.PersonList
              where person.Name == "John"
              select person)
             .FirstOrDefault();

或者另一种写作方式:

var person = buildings.SelectMany(building => building.PersonList)
                      .FirstOrDefault(person => person.Name == "John");