如何使用字符串列表过滤字符串列表列表

时间:2016-12-25 19:15:20

标签: c# string list search filter

我有一个数据视图,它由一个使用字符串列表的对象填充。我想通过在文本框中键入搜索词来选择合适的条目。

我的对象:

<div #visualTextDiv class = "visual_text" [ngStyle]=setStyles()>

  <div *ngFor="let lineCounter of visualDivArray">
    <app-visual-text-div></app-visual-text-div>
  </div>

</div>

我的数据视图条目:

if(this.visualDivArray.length < currentDivIndex+1){
  let newv = new VisualTextDivComponent()
  this.visualDivArray.push(newv);
  console.log("creating new " + this.visualDivArray.length);
}

this.visualDivArray[currentDivIndex].setData(textValue);

我的目标是过滤像Windows资源管理器中的搜索功能这样的条目,但不同之处在于我想要包含四列,而不仅仅是包含文件名的列。 有可能这样做吗?

我尝试过:

from pygame import *
from pygame.locals import *
import pygame
from sys import exit
from random import *
import time

pygame.init()
font.init()

screen = display.set_mode((1920, 1080), FULLSCREEN)
screen.fill((0, 0, 0))

countTime = 1
while countTime < 4:
    default_font = pygame.font.get_default_font()
    font_renderer = pygame.font.Font(default_font, 45)
    label = font_renderer.render(str(countTime).\
            encode('utf-8'), 1, (255, 255, 255))
    screen.blit(label, (1920/2, 1080/2))
    countTime += 1
    time.sleep(1)

希望你能帮助我。

3 个答案:

答案 0 :(得分:0)

为什么不能使用{/ 1}}方法

Contains()

答案 1 :(得分:0)

您可以将所有子列表合并到一个列表中,然后将Any扩展应用于要搜索的单词列表

foreach (my_object m in Source)
{
    List<string> allStrings = m.Column1.Union(m.Column2)
                                       .Union(m.Column3)
                                       .Union(m.Column4)
                                       .ToList();
    bool exists = SearchWords.All(x => allStrings.IndexOf(x) != -1));    
    if(exists)
        results.Add(m); 
}

但是我会针对更传统的解决方案测试性能

答案 2 :(得分:0)

这样做的一种方法是重构你的类以允许搜索。这是一个使用索引的示例:

class my_object
{
    class Coordinates
    {
        public int _column = 0;
        public int _row = 0;
        public Coordinates(int row, int column)
        {
            _column = column;
            _row = row;
        }
    }
    List<List<string>> columns = new List<List<string>>(4);
    Dictionary<string, List<Coordinates>> searchIndex = new Dictionary<string, List<Coordinates>>();
    public my_object()
    {
        for (int i = 0; i < columns.Count; i++)
        {
            columns[i] = new List<string>();
        }
    }
    //This will create entries for each consecutive substring in each word that you add.
    public void AddWord(string word, int column)
    {
        for (int i = 0; i < word.Length; i++)
        {
            int limit = word.Length - i;
            for (int j = 1; j < limit; j++)
            {
                string temp = word.Substring(i, j);
                if (!searchIndex.ContainsKey(temp))
                {
                    searchIndex.Add(temp, new List<Coordinates>());
                }
                searchIndex[temp].Add(new Coordinates(columns.Count, column));
            }

        }
        columns[column].Add(word);
    }
    //This will return a list of list of strings that contain the search term.
    public List<List<string>> Find(string term)
    {
        List<List<string>> outVal = new List<List<string>>(4);
        if(searchIndex.ContainsKey(term))
        {
            foreach(Coordinates c in searchIndex[term])
            {
                outVal[c._column].Add(columns[c._column][c._row]);
            }
        }
        return outVal;
    }
}