我有一个集合,我想用包含多个值的列之一对其进行过滤。过滤器值是动态生成的,我不知道会得到多少。
我尝试了以下操作但未成功:
var input = @"was.Name.Contains(""Test"") || was.Name.Contains(""Test2"")";
var test = collection.Where(was => input)).ToList();
答案 0 :(得分:3)
假设您以CSV字符串的形式接收过滤器值:
class Node {
private static HashMap<N, Property> properties;
public Property getProperty() {
return properties.get(this);
}
}
这应转换为以下SQL:
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();
答案 1 :(得分:2)
我猜您想使用LINQ。问题是,如何保留“过滤器”值?我会以理解您问题的方式回答。
如果应该以{{1}}为条件,那么我建议使用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);
}
中获得名称为Test1或Test2的所有元素。当然,Cast是元素实例化的类的名称。