linq表达式作为参数

ilj*_*jon 6 c# linq

我必须像这样查询集合:

myList.Where(s => myFilters.Contains(s.CountryCode))
Run Code Online (Sandbox Code Playgroud)

s.CountryCode上面是一个例子.我想让它变量并调用不同的列,如下所示:

myList.Where(s => myFilters.Contains(s.City))
myList.Where(s => myFilters.Contains(s.Region))
myList.Where(s => myFilters.Contains(s.Zipcode))
Run Code Online (Sandbox Code Playgroud)

所以我想定义列表达式是参数的函数.这种功能的签名是什么?

public void MySelect( ??? )
{
    myList.Where(s => myFilters.Contains(???);
}
Run Code Online (Sandbox Code Playgroud)

myListObservableCollection,myFiltersList<string>

pok*_*oke 10

将此扩展方法放在静态类中:

public static IEnumerable<T> WhereContains<T, TValue> (this IEnumerable<T> obj, IEnumerable<TValue> container, Func<T, TValue> propertyAccess)
{
    return obj.Where(o => container.Contains(propertyAccess(o)));
}
Run Code Online (Sandbox Code Playgroud)

此扩展方法的工作方式是它接受一个lambda函数,该函数解析给定类型对象的属性.所以你只需要传递一个简单的lamba就好x => x.City了.

由于它完全是通用的而不是特定于您的一个myFilters集合,因此您还需要将其传递给该函数.但是,这也允许您在WhereContains许多其他情况下使用它.

使用它看起来像这样:

// Test is a class with two string properties `City` and `Region`
var myList = new List<Test>{
    new Test() { City = "asdf", Region = "fdsa" },
    new Test() { City = "foo", Region = "bar" },
    new Test() { City = "bar", Region = "baz" }
};

var myFilters = new List<string> { "asdf", "bar" };

myList.WhereContains(myFilters, x => x.City); // contains asdf/fdsa and bar/baz
myList.WhereContains(myFilters, x => x.Region); // contains foo/bar
Run Code Online (Sandbox Code Playgroud)