lio programista
lio programista

Reputation: 65

Filter a collection column by multiple values

I have a collection and I would like to filter it with one of the column contains multiple values. The filter values are dynamically generated and I dont know how many I will get.

I tried the following without success:

var input = @"was.Name.Contains(""Test"") ||  was.Name.Contains(""Test2"")";                             

var test = collection.Where(was => input)).ToList();

Upvotes: 0

Views: 3045

Answers (2)

RaV
RaV

Reputation: 21

I guess you want to use LINQ. The question is, how the "filter" values are kept? I'll answer in the way I understand your question.

If input is supposed to be a condition then I'd suggest using Func<Object,bool>. This means, the input would be the condition you're looking for, and if found, it would return true.

Here is a simple example:

IEnumerable <T> FindElements (Func<Object, bool> condition, IEnumerable<T> inputList)
{   
    List<T> outputList = new List<T>();
    foreach(var element in inputList)
    {
        if(condition != null && condition(element))
          outputList.Add(element);
    }
    return outputList;
}

Then, if you call the function given exemplary parameters:

string input[] = {"Test1","Test2"};
foreach(string s in input)
{
   targetList = FindElements(element=>((cast)element).Name.Contains(s), collection);
}

You should get all elements in collection which name has Test1 or Test2. Cast is of course name of the class which element instantiates.

Upvotes: 2

trashr0x
trashr0x

Reputation: 6565

Assuming you receive the filter values as a CSV string:

var csvFilters = "Test1, Test2";
// split by ',', remove empty entries, 
// trim each filter and store the result in a list
var filters = csvFilters.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(x => x.Trim())
                        .ToList();

// return items in collection whose Name property
// is equal to any of the items in filters
var result = collection.Where(x => filters.Contains(x.Name)).ToList();

This should translate to the following SQL:

SELECT * FROM collection c 
WHERE c.Name IN ('Test1', 'Test2')

Upvotes: 3

Related Questions