2

我有一个列表,根据 Xaml 中 TextBox 中的文本输入进行过滤。下面的代码过滤存储在results变量中的列表。代码检查文本框输入,即 是否完全queryString匹配列表Name中的任何项目results。这只会从列表中带回字符串与项目名称完全匹配的项目。

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

如何更改它以返回列表Name中与 queryString相似的项目?

描述我所说的相似的意思:列表中的一个项目有一个 Name= Smirnoff Vodka。我想要这样,如果在文本框中输入“vodka”或“smirnoff”,将返回 Smirnoff Vodka 项目。

与上面的代码一样,要让 Smirnoff Vodka 作为结果返回,必须在文本框中输入确切的名称“Smirnoff Vodka”。

4

3 回答 3

2

这真的取决于你的意思,说“相似”

选项:

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

2)还有一种称为“Levenshtein distance”的算法:

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

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

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

于 2013-10-28T05:20:46.493 回答
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;
于 2013-10-28T06:06:24.870 回答
0

尝试这个:

fileList.Where(item => filterList.Contains(item))
于 2013-10-28T05:20:07.447 回答