使用linq过滤列表以获取类似项目

时间:2013-10-28 05:01:24

标签: c# linq visual-studio-2012

根据Xaml中TextBox中的文本输入,我有一个列表可以过滤。下面的代码过滤了results变量中存储的List。代码检查文本框输入(即queryString)是否与Name列表中的任何项目的results完全匹配。这仅返回列表中的项目,其中字符串与项目的名称完全匹配。

var filteredItems = results.Where(
                p => string.Equals(p.Name, queryString, StringComparison.OrdinalIgnoreCase));

如何更改此设置,以便将Name类似的列表中的项目返回到queryString?

类似描述我的意思: 列表中的项目具有Name = Smirnoff Vodka。我想要它,如果在文本框中输入“伏特加”或“smirnoff”,将返回项目Smirnoff Vodka。

正如上面的代码所示,为了让Smirnoff Vodka返回结果,必须在文本框中输入确切名称“Smirnoff Vodka”。

3 个答案:

答案 0 :(得分:2)

这实际上取决于你的意思,说“相似”

选项:

1) var filteredItems = results.Where( p => p.Name != null && p.Name.ToUpper().Contains(queryString.ToUpper());

2)还有一种已知的算法为“Levenshtein距离”:

http://en.wikipedia.org/wiki/Levenshtein_distance

http://www.codeproject.com/Articles/13525/Fast-memory-efficient-Levenshtein-algorithm

最后一个链接包含c#中的源代码。通过使用它,您可以确定查询字符串与列表中的字符串“有多接近”。

答案 1 :(得分:0)

试试这个:

fileList.Where(item => filterList.Contains(item))

答案 2 :(得分:0)

试试这个:

var query = "Smirnoff Vodka";
var queryList = query.Split(new [] {" "}, StringSplitOptions.RemoveEmptyEntries);

var fileList = new List<string>{"smirnoff soup", "absolut vodka", "beer"};

var result = from file in fileList
             from item in queryList
             where file.ToLower().Contains(item.ToLower())
             select file;