1

私は2つのリストを持っています:

を。リクエストされたアメニティ
b. アメニティ付きのユニット。

「リクエストされたアメニティ」のいずれかを持つユニットをフィルタリングしたいと思います。ループを使用して同じ結果を達成しようとしましたが、foreachLINQ を使用するとはるかに簡単になるはずです。誰か助けて\アドバイスくれませんか?

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
            }
        }
    }
}
4

3 に答える 3

1

交差ルールへの準拠に基づいてフィルタリングできます

var matchedAmenities = ExactMatchApartments.Where(ema => ema.Amenities
                                               .Any(x => unitSearchRequestAmenities
                                                   .Count(y => y.ID == x.ID) == 1));
exactMatchApartmentsFilteredByAmenities.AddRange(matchedAmenities);

Intersectこれは、既定の LINQIntersect拡張機能がラムダ式をサポートしていないことを考えると、やや "カスタム"です。

于 2012-06-12T03:59:45.523 に答える
0

あなたのタイプから見分けるのは難しいですが、次のようにするとうまくいくはずです

from unit in ExactMatchApartments
from amenity in unit.Amenities
join requestedAmenity in unitSearchRequestAmenities
on amenity.ID equals requestedAmenity.ID
select unit

これは、ドット表記とは対照的に、クエリ式の方が読みやすく理解しやすい場合です。

于 2012-06-12T03:49:37.220 に答える
0

ジェイソンに感謝します。Except ではなく Intersect である必要があると思います。コードを次のように変更しました。

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;
        }
    }
}    

コードをテストし、ここで結果を更新します。

于 2012-06-12T04:04:11.213 に答える