2013-10-16 52 views
0

我想根据文本框搜索集合。应允许用户以任意顺序输入多个单词。意思是集合中的字符串是“多么美好的一天”,并且用户输入字符串应该出现的“天什么”。现在我知道如何处理与允许的单词数量(例如,只允许3个单词)并且使用类似的方式进行编码;C#动态集合

nc = oc.Where(X => X.SearchData.IndexOf(words[0]) > -1 || X.SearchData.IndexOf(words[1]) > -1 || X.SearchData.IndexOf(words[2]) > -1); 

注意:是的我知道我必须保护以确保数组中有实际的3个值,但没有显示。

问题在于它限制了用户,我不想这样做。如果用户想要搜索10或20个事情,那么这对我来说很好。

有没有办法动态创建收集oc的Where语句?

感谢

+0

如果用户输入多个单词,做的结果需要包含所有的单词或只是1的话吗? – David

回答

5

你需要更多的LINQ:

oc.Where(x => words.Any(w => x.SearchData.IndexOf(w) > -1)) 
+0

LINQ所有的东西! –

+0

+1。如果数据是在任何合理的大小转换'字'到'HashSet'首先会使搜索更快(但不再是一个声明:))... –

+0

这将发现部分匹配不是吗?因此,如果用户键入“mat”并且要搜索的短语是“这不应该匹配”,它将匹配。这听起来不对。 –

0

IndexOf(w)回报true即使w是匹配的子字符串。例如在你的例子中,如果用户输入Wha那么它会与什么匹配。据我了解,情况并非如此。所以,你可以简单地拆分SearchData并搜索它:

var enteredWords = SearchData.Split(); 
return oc.Where(p=> enteredWords.Any(q=>p.Contains(q)); 
0

我觉得@Slaks的答案将匹配部分的话,按我的意见,并通过@Alireza

给出的答案

你可以尝试

oc.Where(phrase => phrase.Split().Intersect(SearchData.Split()).Count() > 0); 

总有一些与LINQ各种方式......