1

人々オブジェクトの町を持つすべての人々をショップオブジェクトの町でフィルタリングする拡張メソッドを作成したい

class people
    string name
    string town

class shops
    string category
    string town

私は書くことができることを知っています

var x = from p in people
        from s in shops
        where p.town == s.town

でも書き方を知りたい

var x = from p in people.FilterByTown(p) or FilterByTown(p => p.town) or however it is!!

ここで、FilterByTownは拡張メソッドであり、すべての魔法がそこで機能し、渡したオブジェクトがショップオブジェクトと比較されます。

メソッドに供給されるさまざまなオブジェクトで動作する必要があります

すべてが理にかなっていることを願って、上記のコードは明らかに疑似です!

4

4 に答える 4

2

リフレクションを使用すると、任意のタイプの任意のプロパティに基づいてフィルタリングできます。

public static IEnumerable<T> FilterByProperty<T>(this IEnumerable<T> source,
                                                 string property,
                                                 object value)
{
    var propertyInfo = typeof(T).GetProperty(property);

    return source.Where(p => propertyInfo.GetValue(p, null) == value);
}

使用法:

IEnumerable<People> cityPeople = myPeople.FilterByTown("Town", "MyCity");

リストが必要な場合:

List<People> cityPeopleList = myPeople.FilterByTown("MyCity").ToList();
于 2012-05-31T21:59:15.697 に答える
1

あなたが2つのコレクションの人々と店を持っていると仮定すると、あなたはこれを書くことができます:

List<People> people = ...
List<Shops> shops = ...

IEnumerable<People> Filter(this IEnumerable<People> people, IEnumerable<Shops> shops){
var result = people.Where(p=>shops.Any(s=>s.town == p.town));
return result;
}

すべてのクラスを任意のプロパティで並べ替える場合は、次のバージョンを試すことができます。

public static IEnumerable<T1> Filter<T1, T2>(
    this IEnumerable<T1> one, 
    IEnumerable<T2> two, string property)
        {
           var result = one.Where(o => two.Any(t =>
               o.GetType().GetProperty(property).
               GetValue(o, null).Equals(t.GetType().
               GetProperty(property).GetValue(t, null))));
           return result;
        }

もちろん、プロパティが有効であり、両方のオブジェクトがそれを持っていることを確認する必要があります。

于 2012-05-31T21:56:10.030 に答える
0

私があなたの質問を正しく理解しているなら、あなたはこのようなものが欲しいです:

public static IEnumerable<People> FilterByTown(this IEnumerable<People> people, IList<Shop> shops)
{
    return people.Where(p => shops.Any(s => s.Town == p.Town));
}

使用法:

peoples.FilterByTown(shops);
于 2012-05-31T22:10:41.750 に答える
0

ユニークな町のリストを作成すると、クエリを高速化できます

public static class PeopleExtensions
{                             
    private static List<string> _distinctShopTowns;

    private static List<Shop> _shops;
    public static List<Shop> Shops
    {
        get { return _shops; }
        set {
            _shops = value;
            _distinctShopTowns = _shops
                .Select(shop => shop.town)
                .Distinct()
                .ToList();
        } 
    }

    public static IEnumerable<Person> PeopleInTownsWithShops(this IEnumerable<Person> people)
    {
        return people.Where(p => _distinctShopTowns.Contains(p.town));
    }
}

あなたはそれをこのように呼ぶことができます

List<Shop> shops = ...;
List<Person> people = ...;

PeopleExtensions.Shops = shops; // Do every time the shop list changes.

var x = from p in people.PeopleInTownsWithShops();
于 2012-05-31T22:22:23.150 に答える