How to filter generic lists by different algorithms or filter criteria?

We have a situation that extends beyond normal security/permissions where in addition to determining if users have access to certain areas of an application with security principles and identities we need to filter results within sections of the application based on additional values.  Is there a generic way to filter values in a generic list using a different function (e.g. predicate delegates or something similar)?

Example:  Imagine that an application determines if user’s have access to a customer editing screen, but then additionally needs to determine which Customers the user has access to view based on a variety of criteria (e.g. by the Company the customer belongs to, by the Region, by the Customer Level, etc.).  Then imagine that on another section of the application you need to do this same type of filtering of the data that the user can see or edit using different objects and criteria and the filtering cannot be done in the WHERE clause of select statements (e.g. many many pre-existing stored procs that do not use this model).

Take these for example: Filter a List<Person> by peole with the Name == 'John' .  Filter a List<Customer> by customers that have any of the following companies listed for the Company value "Microsoft", "Apple", "Dell" and their Customer Tier is == 2.

  public class Person
        public Person()
            Id = Guid.NewGuid();

        public string Name { get; set; }
        public Guid Id { get; set; }

public class Customer : Person
        public string Company { get; set; }
	public string Region { get; set; }
	public int Tier { get; set; }

Open in new window

Who is Participating?
BurniePConnect With a Mentor Commented:
You can use lambda expression to filter your results :

List<Person> oPersonList = GetPersonList();
oPersonList = oPersonList .Where(c => c.Name == "John").ToList();

List<Customer> oCustomerList = GetCustomerList();
oCustomerList = oCustomerList.Where((c => c.Company == "Microsoft" || c.Company == "Apple" || c.Company == "Dell") && c.CustomerTier == 2)).ToList();

Open in new window

Carl TawnSystems and Integration DeveloperCommented:
You can use the FindAll() method of a generic List<> to return a new list filtered based on a delegate.
Alpesh PatelAssistant ConsultantCommented:
There are different functions to short/ find particular element from List. l.e Select, Find, FindAll etc.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.