2

説明に表示される文字列内の単語を数えるための拡張メソッドを作成しました。これが関数です(たとえば、「ソフト」を検索すると、Microsoftに会いたいので、キーワードと呼ぶのは間違っているかもしれませんが、それを先に伝えたかったのです。当時頭に浮かんだのはキーワードだけでした) :

public static int KeywordCount(this string str, string Phrase)
{
    string[] elements = Phrase.ToUpper().Split(' ');
    int count = 0;
    foreach (string element in elements)
    {
        if (str.ToUpper().Contains(element))
            count++;
    }
    return count;
}

次に、アイテムのリストを調べて、少なくとも何かがヒットしたアイテムのみを含め、ヒット数に基づいて並べ替えようとしています(すべてのキーワードが説明に含まれている場合は、上部にある必要があります。など。

私がこれまでに持っているのは:

 selection.AddRange(all.Where(c => c.Description.KeywordCount(query) > 0));

次に、KeywordCountの戻り値に基づいて並べ替えるにはどうすればよいですか?また、私が進む方向では、KeywordCount検索がすべてのアイテムごとに1回、カウントが0より大きいアイテムに対して1回余分に実行されると感じているので、比較と並べ替えを同時に行う方法がある場合は、方法を知りたいのですが。

4

2 に答える 2

3

最初に値とカウントを取得するために選択を行い、次にカウントでフィルター処理し、次にカウントで並べ替えてから、値のみを選択します。

selection.AddRange(
    all.Select(c=>new {Val = c, Count = c.Description.KeywordCount(query))
       .Where(t => t.Count > 0))
       .OrderBy(t => t.Count)
       .Select(t => c.Val);

このようにして、KeywordCount はアイテムごとに 1 回呼び出されます。

于 2012-11-30T17:08:22.040 に答える
1

Linq orderByは機能しますか?

List<someType> sorted = all.OrderBy(c => c.Description.KeywordCount(query)).ToList()
于 2012-11-30T17:04:47.017 に答える