3

linqを使用して効率的な検索を作成しようとしています

ユーザーが検索キーワード (または最初の数文字) を入力すると、それが配列に解析されます。

最初の部分では、すべての単語が見つかった検索フィールドのインスタンスを見つけたいと思います。(後で、私は何かを検索しますが、その部分は機能しています)

string[] arSearchString = searchString.Split(',', ' ', ';');
var codes = from c in CodeList
            where arSearchString.All(val => c.Description.StartsWith(val) || 
                                            c.Description.Contains(" " + val))
            select c;

これは何も返しません。

私がやりたいことは、配列内のすべての単語が説明フィールド内にあるアイテムを返すことです。たとえば、「cat dog」と入力した場合、次のようなものが返されます。

"A Cat and a Dog"
"Dogs and Cats"
"Catatonic Dogma"

ただし、キーの 1 つだけに一致するアイテムは除きます (例: 「My Life as a Dog」)。

誰かが私が間違っていることを見つけたり、解決策を提供したりできますか?

4

2 に答える 2

5

大文字と小文字を区別してくださいToUpper文字列比較用に最適化されているので使用します。編集:私はToUpperInvariant文化的に安全であることを目指しました:)

これを試して:

string[] arSearchString = searchString.Split(',', ' ', ';');
var codes = from c in CodeList
        where arSearchString.All(val => c.Description.ToUpperInvariant().StartsWith(val.ToUpperInvariant()) || 
                                 c.Description.ToUpperInvariant().Contains(" " + val.ToUpperInvariant()))
        select c;

しかし、少し面倒なので、それをチェーンに変換したいと思っています。私はこれを好みますが、次のいずれかを選択できます。

string[] arSearchString = searchString.Split(',', ' ', ';');
var codes = CodeList
    .Where(c => arSearchString
        .All(val => c.Description.ToUpperInvariant().StartsWith(val.ToUpperInvariant()) 
            || c.Description.ToUpperInvariant().Contains(" " + val.ToUpperInvariant())))
于 2013-03-28T21:01:39.227 に答える
1

クエリは大文字と小文字を区別するため、この例では、検索しただけで結果が得られcatませんが、一致しませんCat。検索文字列と比較の両方を.ToUpper()orに変換してみてください.ToLower()

于 2013-03-28T21:07:07.713 に答える