1

我有一个代表一组人的对象集,我想将它用作 DataGridView 控件的数据源。但在此之前,我想根据搜索字符串过滤一组人。因此,如果搜索字符串是“David John”,我希望保留“David Johnson”和“John Davidson”,而不是“John Williams”、“David Beckham”或“Al Green”。

这是我尝试过的:

MyObjectContext context = GetContext();
string searchBox = "John David";
Regex regex = new Regex("[a-zA-Z]+", RegexOptions.Singleline);
MatchCollection matches = regex.Matches(searchBox);
IQueryable<Owner> q = ce.Owner;
foreach (Match match in matches)
{
    q = q.Where(o => o.FirstName.Contains(match.Value) 
        || o.LastName.Contains(match.Value));
}
findOwnerDataGrid.DataSource = q.OrderBy(o => o.LastName);

但它似乎只适用于最后一场比赛“大卫”。

我怎样才能完成我需要做的事情?欢迎任何不同或更简单的解决方案。如果重要,网格是只读的,因此我不必担心绑定/编辑注意事项。

4

1 回答 1

3

我会使用没有正则表达式的 LINQ to Objects。

var items = new List<string>() {
    "David Johnson", "John Davidson", "John Willians", "David Beckham", "Al Green"
};

var queryString = "David John";
var queryItems = queryString.Split(new char[] { ' ' });

var results = items.Where(x => queryItems.All(q => x.Contains(q))).ToList();

返回你想要的。

对于您的List<Owner>查询可能是这样的:

var results = items.Where(x => queryItems.All(q => x.FirstName.Contains(q) ||
                                                   x.LastName.Contains(q)))
                   .ToList();
于 2013-03-17T21:05:57.723 回答