1

一連の人々を表す Objectset があり、それを DataGridView コントロールの DataSource として使用したいと考えています。しかしその前に、検索文字列に基づいて人々のセットをフィルタリングしたいと考えています。したがって、検索文字列が "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);

ただし、最後の一致「David」のみを適用するようです。

必要なことをどのように達成できますか? 異なるまたはより単純なソリューションは大歓迎です。問題があれば、グリッドは読み取り専用なので、バインディングや編集の考慮事項について心配する必要はありません。

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 に答える