2

WinFormsアプリがあり、テキストボックスを使用して検索クエリ(例:メンズブラックTシャツ)を取得し、この検索クエリに基づいてオブジェクトのリストをフィルタリングします。

オブジェクトのリストは注文オブジェクトです。各注文オブジェクトには、性別、サイズ、色などのいくつかのプロパティがありました。

検索クエリをスペース文字で分割して文字列の配列を取得した場合、リスト内のすべての注文オブジェクトのすべてのプロパティに対してこの文字列配列のすべてのアイテムを検索し、のすべての文字列に一致するものを返すための最良の方法は何ですか文字列配列?

たとえば、「キッズブラックミディアム」を検索した場合、キッズANDブラックANDミディアムの注文のみを返品したいので、ブラック注文だけやキッズ注文などは必要ありません。

4

2 に答える 2

3

次のOrderクラスがあるとします。

class Order
{
    public string Size {get; set;}
    public string Gender {get; set;}
    public string Colour {get; set;}
    public string Type {get; set;}

    // List of "searchable" properties
    public IEnumerable<string> GetTags()
    {
        return new []{Size, Gender, Colour, Type};
    }
}

簡単なアプローチは次のようになります。

var list = new []
{
    new Order {Size = "large", Gender = "women", Colour = "red", Type = "tshirt"},
    new Order {Size = "large", Gender = "men", Colour = "black", Type = "tshirt"},
    new Order {Size = "medium", Gender = "kids", Colour = "black", Type = "tshirt"},
    new Order {Size = "medium", Gender = "kids", Colour = "black", Type = "shorts"},
    new Order {Size = "medium", Gender = "men", Colour = "black", Type = "tshirt"}
};

var searchString = "kids black medium";
var searchValues = searchString.Split(new []{" "}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray();

var result = from order in list 
             let tags = order.GetTags()
             where searchValues.All(s => tags.Any(t => t == s))
             select order;

result今含まれています

ここに画像の説明を入力してください

Intersectまたはを使用して検索値/タグを比較することもできますHashSetが、要件の詳細情報がなくてもAll/Anyは十分なソリューションです。

于 2013-02-18T14:12:19.323 に答える
1

次のことを試してください。

class Item
{
    public bool Gender { get; set; }
    public int Color { get; set; }
    public string Type { get; set; }

    public string[] GetKeyWords()
    {
        // Return properties as array of key words.
        // You can cache the result for future use.
        return default(string[]);
    }
}

これで、アイテムのリストと文字列(キーワード)の配列がある場合、次のクエリを記述できます。

var matches = from item in items
              let itemKeyWords = item.GetKeyWords()
              where keyWords.All(k => itemKeyWords.Any(c => c == k))
              select item;
于 2013-02-18T14:12:00.070 に答える