HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Filtering a list based on a value

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
listvaluebasedfiltering

Problem

Based on dropdown value and search text I need to filter a list and return.

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.