2

我有一个 WinForms 应用程序,我想在其中使用文本框来接受搜索查询(例如男士黑色 T 恤),然后根据此搜索查询过滤对象列表。

对象列表是订单对象。每个订单对象都有几个属性,例如性别、大小、颜色等。

如果我通过空格字符拆分搜索查询来获得一个字符串数组,那么针对列表中每个订单对象中的每个属性搜索此字符串数组中的每个项目并返回匹配所有字符串的最佳方法是什么字符串数组?

例如,如果我搜索“kids black medium”,我只想返回 kids AND black AND medium 的订单,所以我不想要黑色订单或只是 kids order 等。

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现在包含

在此处输入图像描述

您也可以使用Intersector aHashSet来比较搜索值/标签,但没有更多的需求信息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 回答