public void ClearPossibleMoves(Piece piece, params Predicate <IMove>[] predicates) { var illegalMoves = new List <IMove>(); var moves = piece.GetMoves(); foreach (var move in moves) { var illegal = false; foreach (var predicate in predicates) { if (!predicate(move)) { continue; } illegal = true; break; } if (illegal) { illegalMoves.Add(move); } } piece.ClearMoves(illegalMoves); }