我必须像这样查询集合:
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)
myList是ObservableCollection,myFilters是List<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)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |