gpt4 book ai didi

c# - linq表达式作为参数

转载 作者:太空狗 更新时间:2023-10-29 21:08:15 24 4
gpt4 key购买 nike

我必须像这样查询集合:

myList.Where(s => myFilters.Contains(s.CountryCode))

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

myList.Where(s => myFilters.Contains(s.City))
myList.Where(s => myFilters.Contains(s.Region))
myList.Where(s => myFilters.Contains(s.Zipcode))

所以我想定义列表达式作为参数的函数。这个函数的签名是什么?

public void MySelect( ??? )
{
myList.Where(s => myFilters.Contains(???);
}

myList是一个 ObservableCollection , 和 myFiltersList<string>

最佳答案

把这个扩展方法放在一个静态类中:

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

此扩展方法的工作方式是它接受一个 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

关于c# - linq表达式作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35337960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com