using System.Collections.Generic;
var userManager = new UserManager();
SearchAndDisplay(userManager, null, "Anne", "Droid");
SearchAndDisplay(userManager, null, "Anne", "Borgue");
SearchAndDisplay(userManager, null, "Simon", "Borgue");
SearchAndDisplay(userManager, "Two", null, null);
SearchAndDisplay(userManager, "Four", null, null);
SearchAndDisplay(userManager, null, null, null);
SearchAndDisplay(new UserManager(true), null, null, null);
void SearchAndDisplay(UserManager userManager, string searchByUsername, string searchByGivenName, string searchBySurname)
Predicate<User> searchCriteria = PredicateBuilder.And<User>();
if (!string.IsNullOrEmpty(searchByUsername)) searchCriteria = PredicateBuilder.And<User>(searchCriteria, user => searchByUsername.Equals(user.Username, StringComparison.InvariantCultureIgnoreCase));
if (!string.IsNullOrEmpty(searchByGivenName)) searchCriteria = PredicateBuilder.And<User>(searchCriteria, user => searchByGivenName.Equals(user.GivenName, StringComparison.InvariantCultureIgnoreCase));
if (!string.IsNullOrEmpty(searchBySurname)) searchCriteria = PredicateBuilder.And<User>(searchCriteria, user => searchBySurname.Equals(user.Surname, StringComparison.InvariantCultureIgnoreCase));
var result = userManager.UserMatchingCriteriaExists(searchCriteria);
Console.WriteLine("Search Criteria:\n\tUsername: {0}\n\tGivenName: {1}\n\tSurname: {2}\nFound: {3}", searchByUsername ?? "not searched", searchByGivenName ?? "not searched", searchBySurname ?? "not searched", result);
public string Username{get; set;}
public string GivenName{get; set;}
public string Surname{get; set;}
readonly IEnumerable<User> users;
public UserManager(): this(false) {}
public UserManager(bool noUsers)
new User(){Username = "one", GivenName = "Anne", Surname = "Droid"}
,new User(){Username = "two", GivenName = "Simon", Surname = "Borgue"}
,new User(){Username = "three", GivenName = "Alex", Surname = "Arnold"}
public bool UserMatchingCriteriaExists(Predicate<User> criteria)
return users.Any(user => criteria(user));
static class PredicateBuilder
public static Predicate<T> And<T>(params Predicate<T>[] predicates)
foreach (var predicate in predicates)