C# ICollectionView多重过滤器

C# ICollectionView多重过滤器,c#,C#,因此,我有一个fitler文本框,我想在其中搜索网格中不同类型的文档,代码中有不同类型的列,例如:Date、DocId、ClientId。 对于一个搜索,我在一个过滤器文本框中写下类似于DocId:2002的东西,它工作得很好,但是当我尝试进行多个搜索,例如DocId:2002 ClientId:201时,它不会搜索,因为返回它只是执行一个无限循环 private void TextBoxFilter\u TextChanged(对象发送者,textchangedventargs e) { fo

因此,我有一个fitler文本框,我想在其中搜索网格中不同类型的文档,代码中有不同类型的列,例如:Date、DocId、ClientId。 对于一个搜索,我在一个过滤器文本框中写下类似于
DocId:2002
的东西,它工作得很好,但是当我尝试进行多个搜索,例如
DocId:2002 ClientId:201
时,它不会搜索,因为返回它只是执行一个无限循环

private void TextBoxFilter\u TextChanged(对象发送者,textchangedventargs e)
{
foreach(在Regex.Matches中匹配m((发送者作为文本框)。文本、模式、选项))
{
如果(m.Value!=“”)
{
Func untilSlash=(s)=>{返回筛选器[re.Match.Groups[1].ToString()]=re.Match.Groups[2].ToString();};
直到间隙(m.值);
}
}
ICollectionView cv=CollectionViewSource.GetDefaultView(this.DataGridDocList.ItemsSource);
如果(filters.Count==0)
{
cv.Filter=null;
}
其他的
{
cv.Filter=o=>
{
for(int i=0;iConvert.ToDateTime(DateVerify.Match(filters.ElementAt(i.Value).Groups[2].ToString());
}
其他的
{
var dateString=(o作为文档).DateCreated.ToString(“dd/MM/yyyy”,CultureInfo.InvariantCulture);
return dateString.Contains(DateVerify.Match(filters.ElementAt(i).Value).Groups[1].ToString());
}
}
if(filters.ElementAt(i).Key==“DocId”)
{
return(o作为文档).DocumentId.ToString()包含(filters.ElementAt(i).Value);
}
if(filters.ElementAt(i).Key==“ClientId”)
{
return(o作为文档).ClientId.ToUpper()包含(filters.ElementAt(i.Value.ToUpper());
}
}
返回false;
};
过滤器。清除();
}
}
所以我的问题是,我怎样才能一次用所有的过滤器进行大规模搜索呢?
我可以手动将它们一个接一个地添加,这类似于search1&&search2&&search3,但这会花费太多时间,而且可能不是最好的解决方案

构建谓词的方法很多。但是我的建议是保持简单,只创建一个返回truefalse的方法。一个方法中只返回一次是很好的做法

下面的代码用于说明(因为我无法测试):

ICollectionView cv=CollectionViewSource.GetDefaultView(this.DataGridDocList.ItemsSource);
if(filters.Any())
{
cv.Filter=新谓词(PredicateFilter);
}
其他的
{
cv.Filter=null;
}    
然后使用谓词方法筛选结果:

public bool PredicateFilter(object docObj)
{
    Document doc = docObj as Document;

    var response = new List<bool>();    

    for (int i = 0; i < filters.Count; i++)
    {
        if (filters.ElementAt(i).Key == "Date")
        {
            if (DateVerify.Match(filters.ElementAt(i).Value).Success)
            {
                response.Add(doc.DateCreated < Convert.ToDateTime(DateVerify.Match(filters.ElementAt(i).Value).Groups[1].ToString()) && doc.DateCreated > Convert.ToDateTime(DateVerify.Match(filters.ElementAt(i).Value).Groups[2].ToString()));
            }
            else
            {
                var dateString = doc.DateCreated.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture);
                response.Add(dateString.Contains(DateVerify.Match(filters.ElementAt(i).Value).Groups[1].ToString()));
            }
        }
        else if (filters.ElementAt(i).Key == "DocId")
        {
            response.Add(doc.DocumentId.ToString().Contains(filters.ElementAt(i).Value));
        }
        else if (filters.ElementAt(i).Key == "ClientId")
        {
            response.Add(doc.ClientId.ToUpper().Contains(filters.ElementAt(i).Value.ToUpper()));
        }
    }
            
    return response.All(m => m); // if all filters came back with true, return 1 response of true else false.
}
public bool谓词过滤器(object docObj)
{
单据doc=docObj作为单据;
var response=newlist();
for(int i=0;iConvert.ToDateTime(DateVerify.Match(filters.ElementAt(i).Value).Groups[2].ToString());
}
其他的
{
var dateString=doc.DateCreated.ToString(“dd/MM/yyyy”,CultureInfo.InvariantCulture);
Add(dateString.Contains(DateVerify.Match(filters.ElementAt(i).Value).Groups[1].ToString());
}
}
else if(filters.ElementAt(i).Key==“DocId”)
{
Add(doc.DocumentId.ToString()包含(filters.ElementAt(i.Value));
}
else if(filters.ElementAt(i.Key==“ClientId”)
{
Add(doc.ClientId.ToUpper().Contains(filters.ElementAt(i.Value.ToUpper()));
}
}
返回response.All(m=>m);//如果所有过滤器返回true,则返回1个true-else-false响应。
}

您是否可以上传完整代码,以便我可以重新创建问题?我无法提供完整代码,因为您将无法访问数据库。但是如果你能更具体地说明你需要什么,我可以编辑你的代码,你有变量/方法:过滤器,日期验证,文档,重新-我不确定这些是什么?
public bool PredicateFilter(object docObj)
{
    Document doc = docObj as Document;

    var response = new List<bool>();    

    for (int i = 0; i < filters.Count; i++)
    {
        if (filters.ElementAt(i).Key == "Date")
        {
            if (DateVerify.Match(filters.ElementAt(i).Value).Success)
            {
                response.Add(doc.DateCreated < Convert.ToDateTime(DateVerify.Match(filters.ElementAt(i).Value).Groups[1].ToString()) && doc.DateCreated > Convert.ToDateTime(DateVerify.Match(filters.ElementAt(i).Value).Groups[2].ToString()));
            }
            else
            {
                var dateString = doc.DateCreated.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture);
                response.Add(dateString.Contains(DateVerify.Match(filters.ElementAt(i).Value).Groups[1].ToString()));
            }
        }
        else if (filters.ElementAt(i).Key == "DocId")
        {
            response.Add(doc.DocumentId.ToString().Contains(filters.ElementAt(i).Value));
        }
        else if (filters.ElementAt(i).Key == "ClientId")
        {
            response.Add(doc.ClientId.ToUpper().Contains(filters.ElementAt(i).Value.ToUpper()));
        }
    }
            
    return response.All(m => m); // if all filters came back with true, return 1 response of true else false.
}