c# - 如何在列表中找到子列表的索引?

标签 c# .net

我正在寻找一些有效的方法(在 .NET 中),如何查找某个字节列表中是否有字节序列,如果有,索引第一个开始的位置。

例如假设我有:

var sequence = new List<byte> { 5, 10, 2 };
var listOne = new List<byte> { 1, 3, 10, 5, 10, 2, 8, 9 };
var listTwo = new List<byte> { 1, 3, 10, 5, 2, 10, 8, 9 };

结果应该是我的序列在 listOne 中的索引 3 和 listTwo 中的索引 -1 上(即它不存在)。

当然,我可以逐个循环遍历列表 int 并从每个索引开始搜索,如果后面的数字与我的序列匹配,但有没有更有效的方法(例如使用扩展方法)?

最佳答案

这与子字符串搜索本质上是相同的问题(实际上,顺序很重要的列表是“字符串”的泛化)。

幸运的是,计算机科学长期以来经常考虑这个问题,所以你可以站在巨人的肩膀上。

看看文献。一些合理的起点是:

http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm

http://en.wikipedia.org/wiki/Rabin-karp

即使只是维基百科文章中的伪代码也足以很容易地移植到 C#。查看不同情况下的性能描述,并确定您的代码最有可能遇到哪些情况。 (我认为第一个原因是您所说的搜索关键字列表很短)。

关于c# - 如何在列表中找到子列表的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3529727/

相关文章:

c# - 在没有数据库上下文的情况下将 LINQ 表达式转换为 SQL 文本

c# - 是否可以将 await 与使用自定义函数的查询一起使用

c# - ClosedXML 预定义样式

c# - 比较字典中值之间的差异

c# - 在没有 API(例如 iTextSharp)的情况下在 .NET 中填充 PDF 字段

.net - 在 C++/CLI 中创建时初始化静态字典

c# - 选择所有复选框 WPF

c# - 如何在 Visual Studio IDE 中预览 win 表单设计

c# - Autofac - 单例接口(interface)解析为 transient

.net - 上传失败一次,然后正常工作