3

リストから名前を検索するプログラムをプログラミングしていますが、キーワードが名前の前になくても検索する必要があります (つまり、プレフィックスではないということです)。

たとえば、リストが楽器で、検索テキスト ボックスに「guit」と入力するとします。「Guitar、Guitarrón、Acoustic Guitar、Bass Guitar、...」またはこのLongdo Dictionary の検索候補の ような
名前が見つかるはずです。

これが私の単純で愚かなアルゴリズムです(それが私ができるすべてです)

    const int SEARCHROWLIMIT = 30;
    private string[] DoSearch(string Input, string[] ListToSearch)
    {
        List<string> FoundNames = new List<string>();

        int max = 0;
        bool over = false;
        for (int k = 0; !over; k++)
        {
            foreach (string item in ListToSearch)
            {
                max = (max > item.Length) ? max : item.Length;
                if (k > item.Length) continue;
                if (k >= max) { over = true; break; }
                if (!Input.Equals("Search")
                    && item.Substring(k, item.Length - k).StartsWith(Input, StringComparison.OrdinalIgnoreCase))
                {
                    bool exist = false;
                    int i = 0;
                    while (!exist && i < FoundNames.Count)
                    {
                        if (item.Equals(FoundNames[i]))
                        {
                            exist = true;
                            break;
                        }
                        i++;
                    }
                    if (!exist && FoundNames.Count < SEARCHROWLIMIT)
                        FoundNames.Add(item);
                    else if (FoundNames.Count >= SEARCHROWLIMIT) over = true;
                }
            }
        }
        return FoundNames.ToArray();
    }

このアルゴリズムは多数の名前に対して遅すぎると思います。試行錯誤を繰り返した結果、操作を中断するために SEARCHROWLIMIT を追加することにしました。

もう 1 つの問題は、弦楽器、パーカッションなどのカテゴリと原産国で楽器を検索する必要があることです。そのため、タイプと国によるフィルターでそれらを検索する必要があります。

どうすればこれを達成できますか?

4

3 に答える 3

6

LINQ を使用すると、次のようなコードを記述できます。

var resultSet = products

    // filter products by category
    .Where(product => product.Category == "strings")

    // filter products by origin
    .Where(product => product.Origin == "italy")

    // filter products whose name contains a word starting with "guit"
    .Where(product => (" " + product.Name).Contains(" guit"))

    // limit the result set to the first 30 matching products
    .Take(30);

製品セットがかなり小さい場合は、LINQ-to-Objects を使用できます。それ以外の場合は、データベースを使用して、LINQ-to-SQL を確認する必要があります。

于 2010-04-10T22:27:56.170 に答える
2

一言。データベース!

真剣に、これらのさまざまな検索をすべて実行したい場合は、発生している分類の問題を簡素化するスキーマを使用して、データをデータベースに配置することを検討してください。Sql Server Express は、実行しようとしている種類の検索に非常に役立つ全文検索をサポートするようになりました。

Linq-to-Sql での FTS の使用に関する素晴らしいブログ投稿がここにあります。

于 2010-04-10T22:24:38.483 に答える
0
static List<string> GetItemsWithWordsStartingWithSubstring(List<string> list, string substring)
{
    var query = from str in list
                from item in str.Split(' ')
                where item.StartsWith(substring, StringComparison.InvariantCultureIgnoreCase)
                select str;

    return query.ToList();
}

あなたの最初の質問をきちんと読んだことを願っています。この関数は、部分文字列で始まる単語を含むリストから任意の項目を返します。分割パラメーターにさらに句読点を追加できます。次の内容のリストがあるとします。

"abcdef"、"defabc"、"def abc"、"xyz"

「abc」で検索すると、「abcdef」と「def abc」は見つかりますが、「defabc」は見つかりません。

于 2010-04-10T22:41:15.093 に答える