使用 LINQ 筛选 2 个列表
本文关键字:列表 筛选 LINQ 使用 | 更新日期: 2023-09-27 18:36:55
我有两个列表:
a. 要求的便利设施b. 带便利设施的单位。
我想过滤那些具有任何一种"所需设施"的单位。我尝试使用 foreach
循环实现相同的结果,但我相信使用 LINQ 应该更容易。有人可以帮忙''建议吗?
UnitAmenities unitSearchRequestAmenities = unitSearchRequest.Amenities;
var exactMatchApartmentsFilteredByAmenities= new Units();
IEnumerable<string> requestAmenitiesIds = unitSearchRequestAmenities.Select(element => element.ID);
foreach (var unitCounter in ExactMatchApartments)
{
IEnumerable<string> unitAmenities = unitCounter.Amenities.Select(element => element.ID);
foreach (var requestAmenityId in requestAmenitiesIds)
{
foreach (var unitAmenity in unitAmenities)
{
if (requestAmenityId == unitAmenity)
{
exactMatchApartmentsFilteredByAmenities.Add(unitCounter);
//break to the outmost foreach loop
}
}
}
}
您可以根据是否符合相交规则进行筛选
var matchedAmenities = ExactMatchApartments.Where(ema => ema.Amenities
.Any(x => unitSearchRequestAmenities
.Count(y => y.ID == x.ID) == 1));
exactMatchApartmentsFilteredByAmenities.AddRange(matchedAmenities);
这是一个有点"自定义"Intersect
,因为默认的 LINQ Intersect
扩展不支持 lambda 表达式。
很难从你的类型中分辨出来,但我认为以下内容应该可以解决问题
from unit in ExactMatchApartments
from amenity in unit.Amenities
join requestedAmenity in unitSearchRequestAmenities
on amenity.ID equals requestedAmenity.ID
select unit
在这种情况下,查询表达式比点表示法更易于阅读和理解。
谢谢杰森,我相信它一定是相交而不是除了.我已将代码更改为以下内容:
var amenities = unitSearchRequest.Amenities;
if (amenities.Count > 0)
{
//filter the unit's amenities's id's with the search request amenities's ID's.
var exactMatchApartmentsFilteredByAmenities= new Units();
var requestAmenitiesIds = amenities.Select(element => element.ID);
foreach (var unitCounter in ExactMatchApartments)
{
var unitAmenities = unitCounter.Amenities.Select(element => element.ID);
var intersect =unitAmenities.Intersect(requestAmenitiesIds);
if (intersect.Any())
{
exactMatchApartmentsFilteredByAmenities.Add(unitCounter);
break;
}
}
}
我将测试代码并在此处更新我的结果。