Фильтровать столбец коллекции по нескольким значениям - PullRequest
0 голосов
/ 09 мая 2019

У меня есть коллекция, и я хотел бы отфильтровать ее, так как один из столбцов содержит несколько значений. Значения фильтра генерируются динамически, и я не знаю, сколько я получу.

Я безуспешно пробовал следующее:

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

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

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Предполагается, что вы получите значения фильтра в виде строки CSV:

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();

Это должно привести к следующему SQL:

SELECT * FROM collection c 
WHERE c.Name IN ('Test1', 'Test2')
2 голосов
/ 09 мая 2019

Полагаю, вы хотите использовать LINQ. Вопрос в том, как хранятся значения «фильтра»? Я отвечу так, как понимаю ваш вопрос.

Если input предполагается как условие, я бы предложил использовать Func<Object,bool>. Это означает, что input будет условием, которое вы ищете, и если оно будет найдено, оно вернет true.

Вот простой пример:

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;
}

Тогда, если вы вызываете функцию с заданными примерными параметрами:

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

Вы должны получить все элементы в collection, имя которых имеет Test1 или Test2. Cast - это, конечно, имя класса, экземпляр которого создается элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...