我有一份建筑清单。每个建筑物都有一个人员清单。我在建筑物里寻找约翰。
假设传统搜索可能如下所示:
List<Building> Buildings = CreateBuildings();
foreach(Building building in Buildings)
{
foreach(Person person in building.PersonList)
{
if (person.Name == "John")
{
return person;
}
}
}
也正因为我们可以,这是否意味着我们应该?那么这是对LINQ的反模式/滥用吗?
答案 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");