使用LINQ获取列表中的项目

use*_*648 1 c# linq ienumerable foreach list

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

每个MapCompany都有一个MapLocations列表,MapCompany和MapLocation都有一个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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我是LINQ的新手,想写一个LINQ语句,它将获得具有特定userName的所有MapLocations.

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

Mat*_*gen 5

如果我没错的话,

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));
Run Code Online (Sandbox Code Playgroud)

或者由Marcel B在评论,查询语法中建议:

var mapLocations = from mapCompany in mapCompanies
                   from mapLocation in mapCompany.mapCompanies
                   where mapLocation.userName.Equals(username)
                   select mapLocation;
Run Code Online (Sandbox Code Playgroud)

而且,当然,我会为这个案例以及我能做到的任何其他事情做到这一点,但如果您通常在编写这样的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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然这不能回答你的问题,我的第一个代码块就是这样做的,但这仍然是一种更清洁,通常更好的方式来实现它的方式,因为它可以让你从延迟的性质中受益IEnumerable<T>.