获取与单词列表匹配的字符串子列表

Get a sub-list of string matching a list of word

List<string> myList = new List<string>() 
 { 
      "This is a first matching exemple", 
      "This is second matching exemple", 
      "this one don't match", 
      "Here, the last item" 
 };

 List<string> words = new List<string>() { "This", "is" };

如何获得匹配所有单词的列表

List<string> result = myList.Contains(AllWords???);

编辑 1:我忘记指定单词不必完全匹配。

因此:

 List<string> words = new List<string>() { "This", "i" }

例如必须return相同的结果。

编辑 2:阅读一些答案(chomba 代码示例)后,我将代码更新为:

List<string> _list = new List<string>();
// Populated from factory.
_list = SQLFactory  .GetDataView("Provider")
                    .ToTable()
                    .AsEnumerable()
                    .Select(r => r[1].ToString())
                    .ToList<string>();

// Construct list of word from textbox.
List<string> words = txtName.Text.ToLower().Split(' ').ToList();

// Update ListView
ListView.ListViewItemCollection lvic = new ListView.ListViewItemCollection(lvName);
lvName.BeginUpdate();
lvName.Items.Clear();
lvic.AddRange(_list .AsParallel()
                    .Where(x => words.All(word => x.Contains(word)))
                        .AsParallel()
                        .Select(t => new ListViewItem(t))
                        .ToList()
                        .ToArray());
lvName.EndUpdate();

但是生成的列表视图仍然遗漏了一些项目。

编辑 3:问题已解决。我只需要管理单词的大小写。

lvic.AddRange(_list .AsParallel()
                    .Where(x => words.All(word => x.Contains(word)))
                        .AsParallel()
                        .Select(t => new ListViewItem(t))
                        .ToList()
                        .ToArray());

可能有更有效的方法,但目前想到的是:

 var result = (from sentence in myList let wordsArray = sentence.Split(' ').ToList() 
               where wordsArray.Intersect(words).Count() == words.Count 
               select sentence).ToList();

这应该有效:

List<string> result = myList.Where(x => !words.Except(x.Split(' ')).Any()).ToList();

或者如果您不需要单词完全匹配:

List<string> result = myList.Where(x => words.All(word => x.Contains(word))).ToList();
List<String> myList = new ArrayList<String>(); 

    myList.add("This is a first matching exemple"); 
    myList.add("This is second matching exemple"); 
            myList.add( "this one don't match"); 
                    myList.add("Here, the last item"); 


         List<String> words = new ArrayList<String>();
         words.add("This");
         words.add("is");
         List<String> newList = new ArrayList<String>();
String text = words.get(0)+" "+words.get(1);
Iterator it = myList.iterator();
Iterator it1 = words.iterator();

while(it.hasNext()){
String x =  (String) it.next();
if(x.contains(text)){
    newList.add(x);
}

}
System.out.println(newList);

这是最终的解决方案。我添加了一些并行语法来加速执行。

lvName 是一个列表视图。

txtName 是一个用于查找匹配词的文本框(以空格分隔)。

DataView _view 初始化为一个至少拥有2列的查询。第 2 列是我们要搜索的字符串。

DataView _view = GettingDataFromFunctionCall();
List<string> _list = new List<string>();
// Populated from factory.
_list = _view.ToTable()
             .AsEnumerable()
             .Select(row => row[1].ToString())
             .ToList<string>();

// Construct list of word from textbox.
List<string> words = txtName.Text.ToLower().Split(' ').ToList();

// Update ListView
ListView.ListViewItemCollection lvic = new ListView.ListViewItemCollection(lvName);
lvName.BeginUpdate();
lvName.Items.Clear();
lvic.AddRange(_list .AsParallel()
                .Where(x => words.All(word => x.ToLower().Contains(word)))
                    .AsParallel()
                    .Select(t => new ListViewItem(t))
                    .ToList()
                    .ToArray());
lvName.EndUpdate();