2016-06-28 12 views
-1

配列に2つの要素がある場合は、文字列配列の値を含むリスト内のすべての要素を検索します。

FirstName,LastName,Company 
Donald,Duck,Disney 
Daffey,Duck,Warner Brothers 

私のユーザーが「d」と入力すると、両方のレコードを取得する必要があります。

私のユーザーは「ダック」と入力してもう一度両方のレコードを取得する必要があります。

私のユーザーは「duck disn」と入力すると、最初のレコードしか取得できません。

linqでこれを行う方法はありますか?

編集

私は、最新のがこれです、いくつかのことを試してみました。

var searchTerms = searchText.Split(" ".ToCharArray()); 

enquiryList = enquiryList.Where(x => 
    searchTerms.Contains(x.CompanyName.ToLower()) || 
    searchTerms.Contains(x.FirstName.ToLower()) || 
    searchTerms.Contains(x.LastName.ToLower())).ToList(); 

しかし、これだけ作品、私は完全なディズニーのような言葉ではなくDIS

答えて

4
var searchParts = searchText.Split(' '); 
var matcheds = enquiryList.Where(enquiry => 
{ 
    var texts = new[] { enquiry.FirstName, enquiry.LastName, enquiry.Company }; 
    return searchParts.All(part => texts.Any(text => 
     text.IndexOf(part, StringComparison.OrdinalIgnoreCase) >= 0)); 
}); 

クリアあなたの心の作業。 LINQは簡単です。

あなたはAllは、単語を検索項目をしたいがFirstNameAnyLastNameまたはCompany

+0

私が「duck dis」と入力すると、これはアヒルのディズニーに関連付けられた単一のレコードを返しません。 – griegs

+0

返されます:https://dotnetfiddle.net/U6RfVk – Tommy

+0

奇妙なことが起こる – griegs

3

のような一部の単語を入力した場合、それはあなたが文字列を一致させるための3つのすべてのフィールドを検索したいと私に聞こえます。

3つのプロパティ(FirstName,LastName,Company)を持つPersonというクラスがあるとすると、これを行うことができます。

var splits = searchText.Trim().Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries); 

persons.Where(p=> splits.All(x=> 
       p.FirstName.IndexOf(x, StringComparison.OrdinalIgnoreCase) >=0 
       || p.LastName.IndexOf(x, StringComparison.OrdinalIgnoreCase) >=0 
       || p.Company.IndexOf(x, StringComparison.OrdinalIgnoreCase) >=0)); 

Example

+0

素晴らしいことだが、それはまた、文字列の一部を検索する必要がないことをただ単語全体 – griegs

+1

'IndexOf'は文字列の一部を探します。 –

+1

これはケースをカバーしていません: '私のユーザーは「duck disn」と入力して最初のレコードのみを取得するようになりました。「 – user3185569

1

で発見されたこれは、すべてのケースをカバー:

string[] searchWords = new string[] { "duck", "disn" }; 
List<Duck> myList = new List<Duck>() 
{ 
    new Duck() { FirstName = "Donald", LastName = "Duck", Company = "Disney" }, 
    new Duck() { FirstName = "Daffey", LastName = "Duck", Company = "Warner Brothers" } 
}; 

var duckResults2 = (from duck in myList 
        where searchWords.All 
        (searchStr => 
        duck.FirstName.IndexOf(searchStr, StringComparison.OrdinalIgnoreCase) >= 0 || 
        duck.LastName.IndexOf(searchStr, StringComparison.OrdinalIgnoreCase) >= 0 || 
        duck.Company.IndexOf(searchStr, StringComparison.OrdinalIgnoreCase) >= 0) 
        select duck).ToList(); 
関連する問題