使用LINQ获取列表中的项目

本文关键字:项目 列表 LINQ 获取 使用 | 更新日期: 2023-09-27 18:13:29

我正在使用c# VS2013 Express,希望得到一些帮助来编写LINQ语句。

每个MapCompany都有一个mapplocation列表,并且MapCompany和mapplocation都有一个userName字段。

下面是我的代码:
IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies = await db.mapCompanies.Where(mc => mc.userName.Equals(userName)).ToListAsync();
List<MapLocation> mapLocations = new List<MapLocation>();
foreach (var mapCompany in mapCompanies)
{
    foreach (var mapLocation in mapCompany.mapLocations)
    {
        if (mapLocation.userName.Equals(userName))
        {
            mapLocations.Add(mapLocation);
        }
    }
}

我是LINQ的新手,想写一个LINQ语句,它将获得所有具有特定用户名的MapLocations。

我上面的代码工作,但我想要一些帮助,请将其编码为LINQ语句。

使用LINQ获取列表中的项目

如果我没弄错的话,

IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies = await db.mapCompanies.Where(mc => mc.userName.Equals(userName)).ToListAsync();
var mapLocations = mapCompanies.SelectMany(mapCompany => mapCompany.mapLocations)
                               .Where(mapLocation => mapLocation.userName.Equals(username));

或Marcel B在注释中建议的查询语法:

var mapLocations = from mapCompany in mapCompanies
                   from mapLocation in mapCompany.mapCompanies
                   where mapLocation.userName.Equals(username)
                   select mapLocation;

当然,对于这种情况和任何其他情况,我都会这样做,但如果您通常在编写这样的LINQ表达式时遇到麻烦,您也可以使用yield return模式。同样,我不会在这里,但我也会包括它。

public IEnumerable<MapLocation> GetLocations(IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies)
{
    foreach (var mapCompany in mapCompanies)
    {
        foreach (var mapLocation in mapCompany.mapLocations)
        {
            if (mapLocation.userName.Equals(userName))
            {
                yield return mapLocation;
            }
        }
    }
}

显然这并不能回答你的问题,我的第一个代码块就是这样做的,但这仍然是一个更干净、更好的方法,因为它可以让你从IEnumerable<T>的延迟特性中受益。