patterncsharpMinor
Filtering a list based on a value
Viewed 0 times
listvaluebasedfiltering
Problem
Based on dropdown value and search text I need to filter a list and return.
Method 1
Method 2
I am not convenienced with above logics so please help improve this.
Method 1
if (selectedValue == 1 && searchTerm.Length == 0)
return users;
if (selectedValue == 1 && searchTerm.Length > 0)
return users.Where(user=>user.Name == searchTerm).ToList();
if (selectedValue == 2 && searchTerm.Length > 0)
return users.Where(user=>(user.Name == searchTerm && user.Street == "StreetA")).ToList();
if (selectedValue == 2 && searchTerm.Length == 0)
return users.Where(user=>user.Street == "StreetA").ToList();
if (selectedValue == 3 && searchTerm.Length > 0)
return users.Where(user=>(user.Name == searchTerm && user.Street == "StreetB")).ToList();
if (selectedValue == 3 && searchTerm.Length == 0)
return users.Where(user=>user.Street == "StreetB").ToList();Method 2
if(searchTerm.Length > 0)
{
if (selectedValue == 1)
return users.Where(user=>user.Name == searchTerm).ToList();
if (selectedValue == 2)
return users.Where(user=>(user.Name == searchTerm && user.Street == "StreetA")).ToList();
if (selectedValue == 3)
return users.Where(user=>(user.Name == searchTerm && user.Street == "StreetB")).ToList();
}
else
{
if (selectedValue == 1)
return users;
if (selectedValue == 2)
return users.Where(user=>user.Street == "StreetA").ToList();
if (selectedValue == 3)
return users.Where(user=>user.Street == "StreetB").ToList();
}I am not convenienced with above logics so please help improve this.
Solution
users.Where(user => cond && cond2) is equivalent to users.Where(user => cond).Where(user => cond2)So you can do the following:
IEnumerable resultStream = users;
if(searchTerm.Length > 0)
resultStream = resultStream.Where(user.Name == searchTerm);
switch(selectedValue){
case 1:
return resultStream.ToList();
case 2:
return resultStream.Where(user=>user.Street == "StreetA").ToList();
case 3:
return resultStream.Where(user=>user.Street == "StreetB").ToList();
}Code Snippets
IEnumerable<User> resultStream = users;
if(searchTerm.Length > 0)
resultStream = resultStream.Where(user.Name == searchTerm);
switch(selectedValue){
case 1:
return resultStream.ToList();
case 2:
return resultStream.Where(user=>user.Street == "StreetA").ToList();
case 3:
return resultStream.Where(user=>user.Street == "StreetB").ToList();
}Context
StackExchange Code Review Q#83907, answer score: 8
Revisions (0)
No revisions yet.