Using List<> FindAll with multiple criteria

Hello,

Forgive me if my terminology is not correct.  I am using the code below to return results from a list.  Currently it only uses the "Office" field as criteria how can I add multiple criteria.  For example have it use "Office" and "department".

Thanks
string office = ((ListBox)sender).SelectedValue;            
List<PartnerRecord> results = currentResults.FindAll(delegate(PartnerRecord pr1) 
                { return pr1.Office.Equals(office, StringComparison.CurrentCultureIgnoreCase); });

Open in new window

LVL 3
eshurakAsked:
Who is Participating?
 
Anurag ThakurConnect With a Mentor Technical ManagerCommented:
this should do
string office = ((ListBox)sender).SelectedValue;
string dept = "some value";

List<PartnerRecord> results =
    currentResults.FindAll(delegate(PartnerRecord pr1)
                { return
                               pr1.Office.Equals(office, StringComparison.CurrentCultureIgnoreCase) &&
                               pr1.Department.Equals(dept, StringComparison.CurrentCultureIgnoreCase)
                 ; });
0
 
eshurakAuthor Commented:
It should also compinate for offfice or dept being null.  Right now I'm doing this.

            List<PartnerRecord> results = currentResults;
               
            if (DepartmentList.SelectedValue != "")                
                results = results.FindAll(delegate(PartnerRecord pr1)
            { return pr1.Department.Equals(DepartmentList.SelectedValue.ToString(), StringComparison.CurrentCultureIgnoreCase); });

            if (OfficeList.SelectedValue != "")
                results = results.FindAll(delegate(PartnerRecord pr1)
                { return pr1.Office.Equals(OfficeList.SelectedValue.ToString(), StringComparison.CurrentCultureIgnoreCase); });

It works be I've got four different types of criteria to look at and it's going to get ugly.
0
 
Anurag ThakurTechnical ManagerCommented:
what is your exact requirement
if office and department is present then return on the basis of both

if office is selected and dept is blank then also return results

if office is blank and dept is selected then also return results

and if both are blank then you already have the list

this can be achieved in the if elseif block easily (good for readilibity aslo)

string office = string.Empty;
string dept = string.Empty;
List<PartnerRecord> results = new List<PartnerRecord>();

if (office != string.empty && dept != string.empty)
{
      results = currentResults.FindAll (delegate (PartnerRecord pr1)
                        {
                              return pr1.Office.Equals (office, StringComparison.CurrentCultureIgnoreCase) && pr1.Department.Equals (dept, StringComparison.CurrentCultureIgnoreCase);
                        });
}
else if (office != string.Empty)
{
      results = currentResults.FindAll (delegate (PartnerRecord pr1)
                        {
                              return pr1.Office.Equals (office, StringComparison.CurrentCultureIgnoreCase);
                        });                  
}
else if (dept != string.Empty)
{
      results = currentResults.FindAll (delegate (PartnerRecord pr1)
      {
            return pr1.Department.Equals (dept, StringComparison.CurrentCultureIgnoreCase);
      });
}
else
{
      results = currentResults;
}
0
 
eshurakAuthor Commented:
Thanks for your help.  I went with a series of if statements instead or an if else.  If me it's easier to read and simplier to edit if things change.

            if (DepartmentList.SelectedValue != "")
                results = results.FindAll(delegate(PartnerRecord pr1)
            { return pr1.Department.Equals(DepartmentList.SelectedValue.ToString(), StringComparison.CurrentCultureIgnoreCase); });

            if (OfficeList.SelectedValue != "")
                results = results.FindAll(delegate(PartnerRecord pr1)
                { return pr1.Office.Equals(OfficeList.SelectedValue.ToString(), StringComparison.CurrentCultureIgnoreCase); });

            if (RoleOrCommitteeList.SelectedValue != "")
                results = results.FindAll(delegate(PartnerRecord pr1)
                { return pr1.RoleOrCommittee.Contains(RoleOrCommitteeList.SelectedValue.ToString()); });

            if(isEquity.Checked)
                results = results.FindAll(delegate(PartnerRecord pr1)
                { return pr1.IsEquity.Equals("True",StringComparison.CurrentCultureIgnoreCase); });
0
 
eshurakAuthor Commented:
Thanks again.  Even though I did not use your initial sugguestion it's good to know that I can if I need to.
0
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.