Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C字典最接近键值的快速搜索_C#_Regex_Dictionary - Fatal编程技术网

C# C字典最接近键值的快速搜索

C# C字典最接近键值的快速搜索,c#,regex,dictionary,C#,Regex,Dictionary,我有一根很长的绳子,有几千行。我正在对字符串运行正则表达式,并试图识别匹配的行号。然而,如果我有一个高匹配计数,比如10000,每次查找行号需要再次搜索html字符串,这会很昂贵 我想做的是预先搜索字符串,并构建行号字符位置的哈希表。所以我可以使用字典和下面的代码来找到我的行号 //find line endings int lineCount = 0; for (int charCount = 0; charCount <= html.Length; charCount++) {

我有一根很长的绳子,有几千行。我正在对字符串运行正则表达式,并试图识别匹配的行号。然而,如果我有一个高匹配计数,比如10000,每次查找行号需要再次搜索html字符串,这会很昂贵

我想做的是预先搜索字符串,并构建行号字符位置的哈希表。所以我可以使用字典和下面的代码来找到我的行号

//find line endings
int lineCount = 0;
for (int charCount = 0; charCount <= html.Length; charCount++)
{
     if (html[charCount] == '\n')
     {
         lineCount++;
         lineEndings.Add(charCount, lineCount);
     }
}

当你对equal的定义很接近时,字典就不起作用了

词典中的条目必须是动态的,这一点很重要。如果A=B和B=C,那么A应该等于C。如果情况并非如此,如果平等被定义为刚刚结束,事情就开始崩溃

首先,您无法在这里编写有效的GetHashCode实现。它唯一有效的方法就是所有东西都返回相同的值,这意味着您已经将性能降级为线性搜索


假设您有一组静态字符串,您可以做的是将它们全部放在一个列表或数组中,对它们进行排序,然后使用BinarySearch。由于数据看起来是静态的,因此向查找表中添加项的成本很高这一事实不应该成为问题。二进制搜索还可以告诉您正在搜索的项目如果应该添加,它将属于何处,这意味着您可以在该位置的索引中查找下一个项目,然后减去一个以查找上一个项目。

当您对equal的定义刚刚接近时,字典就不起作用了

词典中的条目必须是动态的,这一点很重要。如果A=B和B=C,那么A应该等于C。如果情况并非如此,如果平等被定义为刚刚结束,事情就开始崩溃

首先,您无法在这里编写有效的GetHashCode实现。它唯一有效的方法就是所有东西都返回相同的值,这意味着您已经将性能降级为线性搜索


假设您有一组静态字符串,您可以做的是将它们全部放在一个列表或数组中,对它们进行排序,然后使用BinarySearch。由于数据看起来是静态的,因此向查找表中添加项的成本很高这一事实不应该成为问题。二进制搜索还能够告诉您正在搜索的项在应该添加的情况下将属于何处,这意味着您可以在该位置的索引中查找下一项,然后减去一项以查找上一项。

如果您知道希望键位于哪个范围,则可以将LINQ与词典一起使用。大概是这样的:

    Dictionary<int, string> Test1 = new Dictionary<int, string>();
    public Form1()
    {
        InitializeComponent();
        Test1.Add(1, "asdf");
        Test1.Add(2, "ghjh");
        Test1.Add(3, "jkl;");
        Test1.Add(4, "qwer");

        int max = 4;
        int min = 1;
        listBox1.DataSource = (from kvp in Test1
                               where (kvp.Key > min && kvp.Key < max)
                               select (kvp.Value)).ToList();

    }

这将从字典中创建一个值集合,其中键位于某个范围内。

如果您知道希望键位于哪个范围内,则可以在字典中使用LINQ。大概是这样的:

    Dictionary<int, string> Test1 = new Dictionary<int, string>();
    public Form1()
    {
        InitializeComponent();
        Test1.Add(1, "asdf");
        Test1.Add(2, "ghjh");
        Test1.Add(3, "jkl;");
        Test1.Add(4, "qwer");

        int max = 4;
        int min = 1;
        listBox1.DataSource = (from kvp in Test1
                               where (kvp.Key > min && kvp.Key < max)
                               select (kvp.Value)).ToList();

    }

这将从字典中创建一个值集合,其中键位于某个范围内。

我不是在分析标记。我正在解析css规则。不管怎样,问题不是正则表达式,而是行号计数和在字典中对行号进行预哈希。您可能想试试nuget上提供的scrapysharp。回购协议就在那里:是的,那不是我想要的。我不需要任何帮助。我需要帮助,给定字符串、行号和哈希表。我没有解析标记。我正在解析css规则。不管怎样,问题不是正则表达式,而是行号计数和在字典中对行号进行预哈希。您可能想试试nuget上提供的scrapysharp。回购协议就在那里:是的,那不是我想要的。我不需要任何帮助。给定一个字符串、行号和哈希表,我需要帮助。我正在做一些类似lineEndings.Firstn=>n.Key>=match.Index.Value的事情,因为我正在按顺序将项目插入字典中;查找第一行结束字符的位置(大于maatch的位置)应该会得到行号结束。除非查找失败?如果要保持项目的添加顺序,可能需要一个列表。通过这种方式,您可以按键或SortedDictionary对列表进行排序。我想,我在做一些类似lineEndings的事情。Firstn=>n.key>=match.Index.Value,因为我正在按顺序将项目插入字典中;查找第一行结束字符的位置(大于maatch的位置)应该会得到行号结束。除非查找失败?如果要保持项目的添加顺序,可能需要一个列表。这样你就可以按键对列表进行排序。我想,也可以按排序字典。