3

「検索」オートコンプリートを実装しています。ユーザーが送信した文字の順序で並べ替えられた結果のリストを返したいと思います。並べ替えられた結果の一番上にあるアイテムは、文字列の最初の文字から n 文字までの文字を持つアイテムです。

LINQ を使用してこれを行うエレガントな方法はありますか?

たとえば、ユーザーが「un」と入力すると、次の項目がデータベースから返されたとします。

  • テキサス州、アメリカ合衆国
  • フロリダ州、アメリカ合衆国
  • ニューヨーク、アメリカ合衆国
  • アメリカ

次のように表示する順序付けられた結果を返したいと思います。

  1. アメリカ
  2. テキサス州、アメリカ合衆国
  3. フロリダ州、アメリカ合衆国
  4. ニューヨーク、アメリカ合衆国

「un」の上の各文字列は、1-2、7-8、10-11、11-12 の位置にあることに注意してください。

4

4 に答える 4

3

通常、@HugoRune からの回答は機能しますが、2 つの問題があるため、少し非効率的です。

  1. を使用ToLower()すると、最初の char の比較で一致しないことが示されている場合でも、最初にすべての文字列が小文字に変換されます。

  2. 基本的に同じ比較を2回行います。で一度Contains()、一度でIndexOf()。したがって、文字列を 2 回実行します。

次のコードは、少なくとも 2 倍効率的です。

        IEnumerable<string> stateNames= [your source here];
        string searchString="un";

        var result = 
            stateNames
                .Select(state=> new {Name=state, Index = state.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase)})
                .Where(tuple=>tuple.Index>=0)
                .OrderBy(tuple=>tuple.Index)
                .Select(tuple=>tuple.Name);
于 2012-07-15T19:21:05.600 に答える
1

IndexOf を使用して部分文字列の位置を取得し、そのインデックスを OrderBy 句で使用できます。

(以下は、列「Name」を持つ db テーブル「States」があることを前提としています)

var result = dc.States
             .Where(s=>s.Name.ToLower().Contains("un"))
             .OrderBy(s=>s.Name.ToLower().IndexOf("un"));

または、毎回データベースにアクセスしたくない場合は、単純なキャッシュソリューション:

// call this once during initialisation
List<States> cachedStates = 
    dc.States.ToList();

...

// call this every time
var result = cachedStates
             .Where(s=>s.Name.ToLower().Contains("un"))
             .OrderBy(s=>s.Name.ToLower().IndexOf("un"));
于 2012-07-15T10:15:33.743 に答える
0

オートコンプリート機能を実装するための私の提案は、アプリケーションのロードとキャッシュ時にすべての国名とその ID を名前の昇順で取得することです。これで、ユーザーが入力するたびに、linq クエリを使用して一致するためにこのキャッシュ結果セットを使用する必要があります。パフォーマンスを向上させるためのもう1つの調整は、最小限の文字を使用することです。たとえば、あなたの場合は2文字で、linqクエリのみを実行します

この方法を実装する理由: すべての文字でキーアップするのではなく、すべての国名を取得するためにデータベースを 1 回だけヒットします。国の変更は毎日行われるわけではないため、アプリケーションの再起動時にのみキャッシュが期限切れになることに注意してください。

お役に立てれば

于 2012-07-15T06:22:17.213 に答える
0

CompareTo次のようにメソッドを使用します。

SomeContext.ACollection.Where(...).OrderBy(x=> searchTerm.CompareTo(x) > 0)

CompareTo メソッドは、比較された文字列が文字順にソートされる場所を示す整数を返します。

于 2012-07-15T19:28:14.070 に答える