LINQ:是否有一种方法可以为where子句提供具有多个参数的谓词?

本文关键字:子句 参数 谓词 where 是否 LINQ 方法 一种 | 更新日期: 2023-09-27 17:54:27

想知道是否有办法做到以下几点:我基本上想为具有多个参数的where子句提供一个谓词,如下所示:

public bool Predicate (string a, object obj)
{
  // blah blah    
}
public void Test()
{
    var obj = "Object";
    var items = new string[]{"a", "b", "c"};
    var result = items.Where(Predicate); // here I want to somehow supply obj to Predicate as the second argument
}

LINQ:是否有一种方法可以为where子句提供具有多个参数的谓词?

var result = items.Where(i => Predicate(i, obj));

您想要的操作称为"部分求值";它在逻辑上与将一个双参数函数"套用"为两个单参数函数有关。

static class Extensions
{
  static Func<A, R> PartiallyEvaluateRight<A, B, R>(this Func<A, B, R> f, B b)
  {
    return a => f(a, b);
  }
}
...
Func<int, int, bool> isGreater = (x, y) => x > y;
Func<int, bool> isGreaterThanTwo = isGreater.PartiallyEvaluateRight(2);

现在你可以在where子句中使用isGreaterThanTwo

如果你想提供第一个参数,那么你可以很容易地写PartiallyEvaluateLeft

有意义吗?

柯里化操作(部分适用于左侧)通常写成:

static class Extensions
{
  static Func<A, Func<B, R>> Curry<A, B, R>(this Func<A, B, R> f)
  {
    return a => b => f(a, b);
  }
}

现在你可以制造工厂了:

Func<int, int, bool> greaterThan = (x, y) => x > y;
Func<int, Func<int, bool>> factory = greaterThan.Curry();
Func<int, bool> withTwo = factory(2); // makes y => 2 > y

都清楚了吗?

你期待这样的事情吗

        public bool Predicate (string a, object obj)
        {
          // blah blah    
        }
        public void Test()
        {
            var obj = "Object";
            var items = new string[]{"a", "b", "c"};
            var result = items.Where(x => Predicate(x, obj)); // here I want to somehow supply obj to Predicate as the second argument
        }