【发布时间】:2018-04-02 11:58:10
【问题描述】:
我的新列表(file.txt)中只有几句话。示例:
- 沃尔特·迪斯尼 (Walt Disney) 拒绝让阿尔弗雷德·希区柯克 (Alfred Hitchcock) 在 1960 年代初在迪斯尼乐园拍摄电影,因为他制作了“那部令人作呕的电影《惊魂记》。
- 狮子王中的彭巴是迪士尼电影中第一个放屁的角色。
- 沃尔特·迪斯尼 (Walt Disney) 向白雪公主和七个小矮人 (Snow White and the Seven Dwarfs) 中的动画师支付了 5 美元,用于制作电影最终版本中的任何插科打诨。
- 电影《十六支蜡烛》中的蛋糕是用硬纸板做的。
等等
我想在我的列表框中只显示这些包含在搜索框中输入的任何单词的句子。例如:当我输入“迪士尼七个小矮人”时,它应该显示“华特迪士尼在白雪公主和七个小矮人中支付了动画师的费用任何进入电影最终版本的恶作剧都需要 5 美元。”在列表的顶部。它不应该显示“电影十六支蜡烛中的蛋糕是用纸板做的。”,因为这句话不包含任何输入的单词。简而言之:在顶部应该显示匹配词数最多的结果。
public static IEnumerable<string> SplitSearchWords(string str)
{
int charIndex = 0;
int wordStart = 0;
while (charIndex < str.Length)
{
wordStart = charIndex;
if (char.IsLetterOrDigit(str[charIndex]))
{
while (charIndex < str.Length && char.IsLetterOrDigit(str[charIndex])) charIndex++;
yield return str.Substring(wordStart, charIndex-wordStart);
}
else
{
while (charIndex < str.Length && !char.IsLetterOrDigit(str[charIndex])) charIndex++;
}
}
}
public static int CalculateSearchRelevance(string searchItem, IEnumerable<string> searchWords)
{
var searchItemWords = SplitSearchWords(searchItem);
return searchWords.Intersect(searchItemWords, StringComparer.OrdinalIgnoreCase).Count();
}
var myFile = File.ReadAllLines("file.txt");
var myList = new List<string>(myFile);
var query = textBox1.Text;
var items = myList;
var searchWords = SplitSearchWords(query).Distinct(StringComparer.OrdinalIgnoreCase).ToList();
var sortedItems = items.OrderByDescending(s => CalculateSearchRelevance(s, searchWords)).ToList();
【问题讨论】:
-
好的 .. 我们知道你想要什么。但是我们需要查看您编写的代码以及您遇到的问题?
-
所以这些是要求。您遇到的问题是什么?
-
更新 :) 下一步是什么?
-
几乎一切正常,但是当我输入 f.e 这个:“这是美好的一天”时,它仍然显示我文件中的所有句子。它应该显示包含任何输入单词的句子。
-
要实现模糊搜索吗?如果是,请检查这个问题 - stackoverflow.com/questions/24948750/…