基于索引遍历集合
本文关键字:遍历 集合 索引 于索引 | 更新日期: 2023-09-27 18:12:28
让我先解释一下情况:
我从集合上的二进制搜索中获得一个值,并快速跳转到该值以进行一些编码。接下来我想跳到列表中的下一项。但下一项并不完全是紧随其后的可能是3或4项之后。以下是我了解情况的数据
Time ID
0604 ABCDE
0604 EFGH
0604 IJKL
0626 Some Data1
0626 Some Data2
0626 Some Data3
0626 Some Data4
假设二进制搜索返回索引0,我跳到索引0 (0604 ABCDE)。我处理/消耗所有的0604。现在我在索引0处,我如何跳转到索引3(0626)并消费/处理所有索引。请记住,这并不总是相同的。数据可以是不同的。所以我不能直接跳转:index + 3
下面是我的代码:
var matches = recordList.Where(d => d.DateDetails == oldPointer);
var lookup = matches.ToLookup(d => d.DateDetails).First();
tempList = lookup.ToList();// build templist
oldPointer
是我通过二分查找得到的索引。我拿起这个,造了一个圣殿。在这之后我想跳到0626
您通常期望有多少条记录具有相同的"旧指针" ?通常会小于100吗?如果是这样,不要使它过于复杂——只需迭代:
public static int FindNextPointerIndex(int oldIndex, string oldPointer, ...)
{
for(int i = oldIndex + 1; i < collection.Count ; i++)
{
if(collection[i].DateDetails != oldPointer) return i;
}
return -1;
}
如果您想要一些更优雅的东西,您将不得不通过DateDetails
预先索引数据,可能在整个集合上使用类似ToLookup
的东西,但是请注意,这使得对数据的更改更加复杂。
看看Skip List, http://en.wikipedia.org/wiki/Skip_list
它将允许你在链表中向前跳转超过1,但缺点是找到你的搜索开始将是O(n)