patterncsharpModerate
LINQ query that filters elements from a list of object
Viewed 0 times
linqelementsqueryobjectthatfilterslistfrom
Problem
I have two lists of objects
Im currently using the following LINQ query to achieve this:
This works apparently well, however, I must iterate twice through PersonList to check if the person exist and its gender. Is there a more elegant way to achieve this?
Person and PersonResult. Both are linked through the property PersonId. I need to create a filter for the list of PersonResult that meet certain criteria for the Person (e.g. Person.Gender == "female").Im currently using the following LINQ query to achieve this:
PersonResultList = PersonResultList.Where(pr =>
PersonList.FirstOrDefault(p => pr.PersonId == p.PersonId) != null &&
PersonList.FirstOrDefault(p => pr.PersonId == p.PersonId).Gender == "female");This works apparently well, however, I must iterate twice through PersonList to check if the person exist and its gender. Is there a more elegant way to achieve this?
Solution
You can simply combine the conditions inside the
Because I only changed your existing code, it didn't came to my mind what Nikita Brizhak commented here .
You should probably use Any instead of FirstOrDefault
So let us change the code to
This is based on the assumption that for each entry in the first list there will be only one entry in the second list.
FirstOrDefault() like PersonResultList = PersonResultList
.Where(pr => PersonList
.FirstOrDefault(p => pr.PersonId == p.PersonId
&& p.Gender == "female") != null );Because I only changed your existing code, it didn't came to my mind what Nikita Brizhak commented here .
You should probably use Any instead of FirstOrDefault
So let us change the code to
PersonResultList = PersonResultList
.Where(pr => PersonList
.Any(p => pr.PersonId == p.PersonId
&& p.Gender == "female"));This is based on the assumption that for each entry in the first list there will be only one entry in the second list.
Code Snippets
PersonResultList = PersonResultList
.Where(pr => PersonList
.FirstOrDefault(p => pr.PersonId == p.PersonId
&& p.Gender == "female") != null );PersonResultList = PersonResultList
.Where(pr => PersonList
.Any(p => pr.PersonId == p.PersonId
&& p.Gender == "female"));Context
StackExchange Code Review Q#93973, answer score: 14
Revisions (0)
No revisions yet.