迭代器采用委托而不是谓词
Iterator taking a Delegate instead of a Predicate
我知道我可以定义一个谓词:
Dim _predicate As New Func(Of T, Boolean)(Function(e)e.Foo= "Value")
并将其传递给 LINQ 方法:
Dim _x as String = enumerable.First(predicate).Foo
我想抽象出 "Value" 字符串,所以我创建了:
Dim _delegate As New Func(Of T, String, Boolean)(Function(e, s)e.Foo= s)
如何将此委托传递给 LINQ 函数,传递字符串参数但仍然让它每次都假定 T 参数是迭代器项?
我想没有可用的重载来接受这样的委托,但我真的不想为所有 LINQ 方法编写自己的重载...
我想我想要的是一种将委托转换为谓词的内联方式,提供替换该额外参数的值。
抱歉,我不是 VB 人,但我确信我的代码可以轻松翻译:
class ValueFilter<T>
where T : IFooThing
{
public ValueFilter(string value)
{
_value = value;
}
private readonly string _value;
public IsMatch(T item) => (item.Foo == _value);
}
然后
var filter = new ValueFilter("A value");
IEnumerable<Foo> collection = ...
collection.First(filter.IsMatch);
(假设 IFooThing
有一个 public string Foo { get; }
属性
我知道我可以定义一个谓词:
Dim _predicate As New Func(Of T, Boolean)(Function(e)e.Foo= "Value")
并将其传递给 LINQ 方法:
Dim _x as String = enumerable.First(predicate).Foo
我想抽象出 "Value" 字符串,所以我创建了:
Dim _delegate As New Func(Of T, String, Boolean)(Function(e, s)e.Foo= s)
如何将此委托传递给 LINQ 函数,传递字符串参数但仍然让它每次都假定 T 参数是迭代器项?
我想没有可用的重载来接受这样的委托,但我真的不想为所有 LINQ 方法编写自己的重载...
我想我想要的是一种将委托转换为谓词的内联方式,提供替换该额外参数的值。
抱歉,我不是 VB 人,但我确信我的代码可以轻松翻译:
class ValueFilter<T>
where T : IFooThing
{
public ValueFilter(string value)
{
_value = value;
}
private readonly string _value;
public IsMatch(T item) => (item.Foo == _value);
}
然后
var filter = new ValueFilter("A value");
IEnumerable<Foo> collection = ...
collection.First(filter.IsMatch);
(假设 IFooThing
有一个 public string Foo { get; }
属性