Вы можете объявить предикат как Func<A, bool>
:
Func<A, bool> predicate = x => x.IsOK || x.Username == username;
Или вы можете объявить его как локальную функцию:
bool predicate(A x) => x.IsOK || x.Username == username;
(К сожалению, вы не можете использовать Predicate<A>
, потому что это не тот тип, который принят IEnumerable.Where()
.)
В любом случае, если он определен внутри метода, он может захватить локальный username
и, следовательно, для него не требуется параметр.
Вот исправленный и компилируемый пример:
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
public class A
{
public string Username { get; set; }
public bool IsOK { get; set; }
}
public class B: A
{
public string test { get; set; }
}
public class C: B
{
public string test2 { get; set; }
}
static class Program
{
public static void Main()
{
var a = new B() { Username = "User1", IsOK = false };
var b = new B() { Username = "user2", IsOK = false };
var c = new C() { Username = "admin", IsOK = true };
List<B> bclasses = new List<B>() { a, b, c };
// I want to filter out username is user2 or IsOK is true
var username = "user2";
bool predicate(A x) => x.IsOK || x.Username == username; // <=== Here is the predicate.
var select = bclasses.Where(predicate).ToList();
}
}
}
Теперь, предположив, что вы на самом деле хотите передать аргумент username
предикату вместо его захвата, вы можете просто добавить параметр в предикат следующим образом:
bool predicate(A x, string name) => x.IsOK || x.Username == name;
И тогда вы передадите username
предикату внутри Where()
следующим образом:
var select = bclasses.Where(item => predicate(item, username)).ToList();