Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# - Fatal编程技术网

C# 查找文本文件中所有字符串出现的行号

C# 查找文本文件中所有字符串出现的行号,c#,C#,我正在尝试编写一个函数,该函数执行以下操作: 给定一个文本文件,我想查找该文件中某个字符串的所有出现;然后,对于每次发生的事件,应该将找到它的行添加到列表中。我们假设每行最多只包含一个事件。文本文件可能会变得非常大,这意味着在文件的每一行上进行简单的for循环会太慢 例如,假设我们有一个包含以下内容的文件: A B C D E F G H J K L M N O G F E D C B A P Q R S T U V 如果我搜索“A”,函数将在第1行和第3行找到它,从而将1和3添加到列表中(然后

我正在尝试编写一个函数,该函数执行以下操作:

给定一个文本文件,我想查找该文件中某个字符串的所有出现;然后,对于每次发生的事件,应该将找到它的行添加到列表中。我们假设每行最多只包含一个事件。文本文件可能会变得非常大,这意味着在文件的每一行上进行简单的for循环会太慢

例如,假设我们有一个包含以下内容的文件:

  • A B C D E F G
  • H J K L M N O
  • G F E D C B A
  • P Q R S T U V
  • 如果我搜索“A”,函数将在第1行和第3行找到它,从而将1和3添加到列表中(然后返回列表)

    我曾考虑过二进制搜索,但它似乎要求对列表进行排序,并且元素必须是不同的——我正在寻找相同的值

    那么,是否有其他搜索算法可以作为我函数的基础,其性能与二进制搜索大致相同


    谢谢

    如果行不经常更改,并且您将对其执行多次搜索,则可以为行编制索引。索引它们的一种方法是创建一个直方图,其中列出了哪些字符出现在哪些行中(可能还有出现了多少次)。然后你可以把它颠倒过来,比如说字母A出现在第5行、第10行和第20行。如果要搜索“ABF”,可以使用倒直方图确定哪些行是候选行(即包含字母“A”、“B”和“F”),然后只查看这些行


    这是否是一种有效的策略将取决于搜索的选择性和搜索字符串的长度等因素。只有通过测试才能发现该算法是否适合您的特定使用模式。

    如果行不经常更改,并且您将对其执行多次搜索,则可以为行编制索引。索引它们的一种方法是创建一个直方图,其中列出了哪些字符出现在哪些行中(可能还有出现了多少次)。然后你可以把它颠倒过来,比如说字母A出现在第5行、第10行和第20行。如果要搜索“ABF”,可以使用倒直方图确定哪些行是候选行(即包含字母“A”、“B”和“F”),然后只查看这些行


    这是否是一种有效的策略将取决于搜索的选择性和搜索字符串的长度等因素。只有测试才能揭示算法是否适合您的特定使用模式。

    所有行的长度是否相同?如果搜索的字符串可以位于任何行的任何位置,您希望如何在访问特定行之前验证它不在任何给定行上?换句话说,你有没有设想过比O(n)(一个for循环)更好的东西这个文件有多大?而且,正如@Rune所指出的,除非您预处理文件并维护每个单词的索引,否则您不可能做得比O(n)更好。好的,谢谢您的评论。。。目前看来,我必须满足于O(n),因为在我的情况下,索引并不是一个真正的选项。所有行的长度都相同吗?如果搜索的字符串可以位于任何行的任何位置,那么在访问特定行之前,您希望如何验证它不在任何给定行上?换句话说,你有没有设想过比O(n)(一个for循环)更好的东西这个文件有多大?而且,正如@Rune所指出的,除非您预处理文件并维护每个单词的索引,否则您不可能做得比O(n)更好。好的,谢谢您的评论。。。目前看来,我必须满足于O(n),因为在我的情况下,索引不是一个真正的选项。嗨,我不确定索引行在我的情况下是一个好的解决方案,因为我不会经常访问文件(可能只访问一次)。正如其他评论所说,我可能暂时不得不坚持使用一个简单的for循环:(嗨,我不确定在我的情况下索引行是一个好的解决方案,因为我不会经常访问文件(可能只访问一次)。正如其他评论所说,我可能暂时不得不坚持使用一个简单的for循环:(